10

...次のようなクエリを実行しようとすると:

Session().query(MyMappedClass).update({MyMappedClass.time:func.now()})

私は得る:

InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.

しかし、もしそうなら:

Session().query(MyMappedClass).update({MyMappedClass.time:'now()'})

...できます。理由を知っている人はいますか?

4

1 に答える 1

12

これはupdate() のドキュメントで説明されています

synchronize_session –</p>

セッション内のオブジェクトの属性を更新する戦略を選択します。有効な値は次のとおりです。

False - セッションを同期しません。このオプションは最も効率的で、セッションが期限切れになると信頼性が高くなります。通常、これは commit() の後に発生するか、明示的に expire_all() を使用して発生します。有効期限が切れる前に、更新されたオブジェクトが属性の値が古いままセッションに残っている可能性があり、結果が混乱する可能性があります。

'fetch' - 更新前に選択クエリを実行して、更新クエリに一致するオブジェクトを見つけます。更新された属性は、一致したオブジェクトで期限切れになります。

'evaluate' - セッション内のオブジェクトに対して直接 Python でクエリの基準を評価します。基準の評価が実装されていない場合、例外が発生します。

update() はデフォルトで、データベースのラウンドトリップを行わずに、セッションにキャッシュされたオブジェクトをリフレッシュしたいと考えています。 func.now()このラウンドトリップを続行する必要がある SQL 関数です。文字列を送信する"now()"と、フィールドの値が文字列 "now()" に設定され、実際には SQL 時間関数が使用されないため、文字列を送信することは望ましくありません。代わりに synchronize_session=False を update() に渡す必要があります。

于 2012-11-18T19:46:34.280 に答える