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



。。。当我尝试执行如下查询时:

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

它是有效的。有人知道为什么吗?

这在update()的文档中有解释

synchronize_session–

选择更新中对象的属性的策略一场有效值为:

False-不同步会话。此选项是最多的会话过期后高效可靠,这通常发生在commit()之后,或显式使用expire_all()。在过期,更新后的对象可能仍保留在会话中值,这可能导致混淆的结果。

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

"evaluate"-直接在对象。如果未对标准进行评估实现时,会引发异常。

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

相关内容

最新更新