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選でした。