使用sqlalchemy结果集进行更新

Lar*_*ell 12 python sqlalchemy

这里真的有两个问题.

如果我像这样运行sqlalchemy查询:

sensors = session.query(Sensor).filter(Sensor.serial_number.in_(data['sensor_serial_numbers'])).all()
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用结果集(传感器)更新所有这些行中的列吗?我无法弄清楚它的语法,所以我尝试这样做:

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

但是,在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.
Run Code Online (Sandbox Code Playgroud)

我认为这必须是因为in_子句,因为我在使用相同的构造之前已经完成了更新,但它们没有in_子句.如何用in_做这样的更新?

kxx*_*ing 22

试试这个:

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

它在此记录:doc

默认值是evaluate哪个

直接在会话中的对象上用Python评估Query的条件.如果未实施标准评估,则会引发异常.

  • @LarryMartell无论是否明确使用`in_`,MetaData都需要选择查询来决定哪些内存中对象到期.如果激活了回声模式,你可以看到选择查询,但我不知道为什么它的设计是这样的. (2认同)
  • 有人可以解释“如果不执行对标准的评估,则会引发异常”?* fetch *非常简单,但是* evaluate *对我来说似乎有点神秘... (2认同)