SQLAlchemyを使用して、遅延リレーションがまだ読み込まれていないかどうかを確認する方法は?

StackOverflow https://stackoverflow.com/questions/258775

  •  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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top