10

...当我尝试执行如下所示的查询时:

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()'})

...有用。有谁知道为什么?

4

1 回答 1

12

这在update() 的文档中进行了解释

synchronize_session –</p>

选择更新会话中对象属性的策略。有效值为:

False - 不同步会话。一旦会话过期,这个选项是最有效的并且是最可靠的,这通常发生在 commit() 之后,或者显式使用 expire_all()。在到期之前,更新的对象可能仍保留在会话中,其属性值过时,这可能会导致结果混乱。

'fetch' - 在更新之前执行选择查询以查找与更新查询匹配的对象。更新的属性在匹配的对象上过期。

'evaluate' - 直接在会话中的对象上评估 Python 中的查询条件。如果未实施标准评估,则会引发异常。

update() 默认情况下希望刷新缓存在 Session 中的那些对象,而无需进行数据库往返。 func.now()是一个 SQL 函数,需要此往返行程才能继续。发送字符串"now()"不是您想要的,因为这会将字段的值设置为字符串“now()”,并且实际上不会使用 SQL 时间函数。您应该将 synchronize_session=False 传递给 update()。

于 2012-11-18T19:46:34.280 回答