SQLAlchemy:マッパーのリレーションは、リレーションが照会されたときに関数を呼び出すのではなく、関数の結果をコンパイルします

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

  •  08-07-2019
  •  | 
  •  

質問

次のようなマッパーが多数あります:

mapper(Photo,photo_table, properties = { "locale": relation(PhotoContent, uselist=False, primaryjoin=and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang()), foreign_keys=[photo_content_table.c.photoId, photo_content_table.c.locale])

Pylonsにデプロイしたので、get_lang()関数は" en"または「es」現在のセッションに基づいています。

from pylons.i18n import get_lang

問題は、SAが&local; locale"をコンパイルすることです。コンパイル時にget_lang()によって返される結果との関係。だから私がこのようなことをしたら:

meta.Session.query(Photo).options(eagerload('locale')).get(id)

リレーションはget_lang()を呼び出しません。コンパイル時にget_lang()の値が何であれ使用します。

ダイナミックなSQLAlchemy eagerloaderを実装する方法はありますか?これは私にとって命の恩人になります!

役に立ちましたか?

解決

関係ステートメントは、クラスがロードされると実行されます。つまり、すべての関数呼び出しが評価されます。

代わりに関数を渡してみてください:

and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang)

括弧がないことに注意してください。リレーションがクエリされるたびに評価されるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top