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