我正在尝试使用以下代码更新表中的一些记录:
session.query(Post).filter(
Post.title.ilike("%Regular%")
).update({"status": False})
Run Code Online (Sandbox Code Playgroud)
但问题是代码抛出了以下异常:
InvalidRequestError: Could not evaluate current criteria in Python: "Cannot evaluate BinaryExpression with operator <function ilike_op at 0x7fbb88450ea0>". Specify 'fetch' or False for the synchronize_session parameter.
Run Code Online (Sandbox Code Playgroud)
但是,如果我传递synchronize_session=False给update(),它会奇迹般地工作。
session.query(Post).filter(
Post.title.ilike("%Regular%")
).update({"status": False}, synchronize_session=False)
Run Code Online (Sandbox Code Playgroud)
那么有什么用synchronize_session呢?
Query.update 是批量操作,即它在 Sqlalchemy 的工作单元事务模型之外进行操作。
synchronize_session 提供了一种方法来指定更新是否应考虑会话中但不在数据库中的数据。
从文档:
同步会话选择更新会话中对象属性的策略。有效值为:
错误 - 不同步会话。此选项是最有效且可靠的,一旦会话过期,通常发生在 commit() 之后,或显式使用 expire_all()。在到期之前,更新的对象可能仍保留在会话中,其属性值已经过时,这会导致结果混乱。
因此,使用synchonize_session=False,在数据库中更新的值将不会在会话中更新。
'fetch' - 在更新之前执行选择查询以查找与更新查询匹配的对象。更新的属性在匹配的对象上过期。
传递fetch使 sqlalchemy 识别会话中受更新影响的值,下次访问时 sqlalchemy 将查询数据库以获取其更新值
'evaluate' - 直接在会话中的对象上评估 Python 中的查询条件。如果未实施对标准的评估,则会引发异常。
在您的代码中,您没有指定值,synchronize_session因此默认值evaluate适用。Sqlalchemy 无法ilike在不委托给数据库的情况下找到对模型进行处理的方法,因此它引发了一个异常,让开发人员决定是否将会话中的值与数据库中的值同步。
| 归档时间: |
|
| 查看次数: |
2597 次 |
| 最近记录: |