2015-11-13 66 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

的默認值是evaluate

評估查詢的Python中的標準直上的 會話的對象。如果評估標準未執行,則會引發異常 。

+0

非常感謝。這工作。但是,你能告訴我爲什麼這個代碼也可以在沒有'synchronize_session'' session.query(ApplicationInstallation).filter_by(control_hub_id = hub_id).filter(ApplicationInstallation.removal_date == None).update({'delete_date':utc_now} )' –

+2

@LarryMartell當你使用'in_'時,無論是否明顯,MetaData都需要一個選擇查詢來決定哪個內存對象到期。你可以看到選擇查詢,如果回聲模式被激活,但我不知道它爲什麼這樣設計。 – kxxoling

+0

任何人都可以解釋「如果評估標準沒有實施,會引發例外」嗎? * fetch *非常直截了當,但*評價*對我來說似乎有點神祕... – Son