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

时间:2012-11-15 21:24:47

标签: python sql database datetime sqlalchemy

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

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

......它有效。谁知道为什么?

1 个答案:

答案 0 :(得分:10)

这在documentation for update()

中有解释
  

synchronize_session -

     

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

     

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

     

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

     

'evaluate' - 直接用Python评估Python中的查询条件   会话中的对象。如果没有评估标准   实施后,提出了一个例外。

默认情况下,

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