...当我尝试执行如下所示的查询时:
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()'})
......它有效。谁知道为什么?
答案 0 :(得分:10)
默认情况下,synchronize_session -
选择策略来更新对象中的对象的属性 会话。有效值为:
错误 - 不同步会话。这个选项最多 一旦会话到期,通常会有效且可靠 发生在commit()之后,或显式使用expire_all()。之前 到期时,更新的对象可能仍然保留在陈旧的会话中 它们的属性值,可能导致混乱的结果。
'fetch' - 在更新之前执行选择查询以查找对象 与更新查询匹配的。更新的属性是 在匹配的对象上过期。
'evaluate' - 直接用Python评估Python中的查询条件 会话中的对象。如果没有评估标准 实施后,提出了一个例外。
update()想刷新Session中缓存的对象而不进行数据库往返。 func.now()
是一个SQL函数,需要此往返才能继续。在字符串"now()"
中发送不是您想要的,因为这会将字段的值设置为字符串“now()”,并且实际上不会使用SQL时间函数。您应该将synchronize_session = False传递给update()。