sqlalchemy:为什么我不能更新到func.now(),但可以使用'now()'?

Pau*_*tch 9 python sql database datetime sqlalchemy

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

Session().query(MyMappedClass).update({MyMappedClass.time:func.now()})
Run Code Online (Sandbox Code Playgroud)

我明白了:

InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

Session().query(MyMappedClass).update({MyMappedClass.time:'now()'})
Run Code Online (Sandbox Code Playgroud)

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

zzz*_*eek 10

这在update()文档中有解释

synchronize_session -

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

错误 - 不同步会话.会话过期后,此选项最有效且可靠,这通常发生在commit()之后,或者显式使用expire_all().在到期之前,更新的对象可能仍然在会话中保留其属性上的陈旧值,这可能导致令人困惑的结果.

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

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

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