エンジニアとしての市場価値を測りませんか?PR

企業からあなたに合ったオリジナルのスカウトを受け取って、市場価値を測りましょう

1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLAlchemy で動的にカラム名を指定したい場合

Last updated at Posted at 2021-12-09

pythonからSQLAlchemyを使ってPostgreSQLを操作することが度々あるのですが、初心者的に忘れがちなものを備忘録として残しておきます。

オブジェクトのカラムを動的に指定する

例えば、Userモデルがこんな感じであったとします。

models.py
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True) 
    clm_0 = db.Column(db.Boolean, default=False)
    clm_1 = db.Column(db.Boolean, default=False)
    clm_2 = db.Column(db.Boolean, default=False)
    clm_3 = db.Column(db.Boolean, default=False)
    clm_4 = db.Column(db.Boolean, default=False)
    clm_5 = db.Column(db.Boolean, default=False)
    clm_6 = db.Column(db.Boolean, default=False)
    clm_7 = db.Column(db.Boolean, default=False)
    clm_8 = db.Column(db.Boolean, default=False)
    clm_9 = db.Column(db.Boolean, default=False)
    clm_10 = db.Column(db.Boolean, default=False)

clm_0〜clm_10は何らかの条件でフラグが入ると思っていて下さい。

例えば、

  • Aが0だったら、clm_0をTrueにしたい
  • Aが1だったら、clm_1をTrueにしたい

みたいな感じの処理を書く場合に、全部定義するのは面倒です。ということで動的にカラムを指定したい。
そういう場合はsetattrを使います。

new_user = User()
target_clm = 'clm_' + str(A)
setattr(new_user,target_clm,True)

こんな風に、カラム指定することが出来ます。

動的にカラム指定してフィルタしたい

例えば、上述のUserテーブルの中から、動的に変化するAに合わせてカラム指定でフィルタしたユーザーリストを取得したい時。

target_clm = 'clm_' + str(A)
user_list = local_session.query(User).filter(getattr(User, target_clm)==True)all()

そんなときは、getattrを使います。

インスタンスのプロパティに動的にアクセスしたい

上述のUserを取得してきたあとに、そのプロパティに動的にアクセスしたい場合はどうするかというとこのような形で取得します。
使っているのはgetattrなので↑と同じですね。

user_row = local_session.query(User).filter_by(id=10).first()
target_clm = 'clm_0'
clm_0 = getattr(user_row, target_clm)

以上

よく使うんだけど忘れがちな2選でした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?