2015-11-13 16 views
7

ここでは2つの質問があります。更新のためにsqlalchemy結果セットを使用

私はこのようなSQLAlchemyのクエリを実行した場合:

sensors = session.query(Sensor).filter(Sensor.serial_number.in_(data['sensor_serial_numbers'])).all() 

を、私はそれらすべての行の列を更新するために、結果セット(センサー)を使用することはできますか?私はそのための構文を把握できなかったので、私はこれをやってみました:

session.query(Sensor).filter(Sensor.serial_number.in_(data['sensor_serial_numbers'])).update({'system_id': system.id}) 

しかし、それは仕方ダウンSQLAlchemyののボウルでの失敗:

File "/home/ecovent/pyenv0.3/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 949, in _do_pre_synchronize 
    "Could not evaluate current criteria in Python. " 
InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter. 

私はそれが原因であることが必要だと思いますin_句を使用していましたが、in_句はありませんでした。 in_でこのような更新をどうすればできますか?

答えて

14

これを試してみてください:

session.query(Sensor)\ 
    .filter(Sensor.serial_number.in_(data['sensor_serial_numbers']))\ 
    .update({'system_id': system.id}, synchronize_session='fetch') 

それはここに文書化されています:doc

デフォルト値は

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

+0

ありがとうございました。これは機能します。しかし、なぜこのコードが 'synchronize_session'' session.query(ApplicationInstallation).filter_by(control_hub_id = hub_id).filter(ApplicationInstallation.removal_date == None).update({'removal_date':utc_now} ) ' –

+2

@LarryMartell' in_'を明示的に使うかどうかにかかわらず、MetaDataがメモリ内オブジェクトのどれが期限切れになるかを決めるためにselectクエリが必要です。エコーモードが有効になっている場合は選択クエリが表示されますが、なぜこのように設計されているのかわかりません。 – kxxoling

+0

「基準の評価が実装されていない場合、例外が発生します」と誰でも説明できますか? *フェッチ*はかなりストレートですが、*評価*は私には少し謎があるようです... – Son