SQLAlchemyを使用して、遅延リレーションがまだ読み込まれていないかどうかを確認する方法は?
-
06-07-2019 - |
質問
SQLAlchemyでは、リレーションが遅延ロードされるかどうかを事前に知る方法はありますか?
たとえば、怠zyな親と子の関係と「親」のインスタンスXが与えられた場合、「X.children」が「X.children」であるかどうかを知りたいクエリをトリガーせずに既にロードされています。
解決
子供の __ dict __
属性辞書を見て、データが既に存在するかどうかを確認できると思います。
他のヒント
sqlalchemy.orm.attributes.instance_state(obj).unloaded
から、すべてのアンロードされたプロパティ(リレーションと列の両方)のリストを取得できます。
参照:オブジェクトとその関係の完了sqlalchemyでの不要なクエリの回避
より簡単な方法は、 inspect()
を使用することです。これにより、同じ結果が得られます。
from sqlalchemy import inspect
from sqlalchemy.orm import lazyload
user = session.query(User).options(lazyload(User.articles)).first()
ins = inspect(user)
ins.unloaded # <- set or properties that are not yet loaded
Haesの答えよりも少しすっきりしています(事実上同じことを行いますが)は、hasattr()を使用することです:
>>> hasattr(X, 'children')
False
所属していません StackOverflow