我正在尝试使用以下代码更新表中的某些记录:
session.query(Post).filter(
Post.title.ilike("%Regular%")
).update({"status": False})
但是问题是代码抛出以下异常:
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.
但是,如果我将synchronize_session=False
传递给update()
,它会奇迹般地发挥作用。
session.query(Post).filter(
Post.title.ilike("%Regular%")
).update({"status": False}, synchronize_session=False)
那么synchronize_session
的用途是什么?
答案 0 :(得分:2)
Query.update是一个批量操作,即它在Sqlalchemy的工作单元事务模型之外运行。
synchronize_session
提供了一种方法,用于指定更新是否应考虑会话中的数据,而不考虑数据库中的数据。
来自docs:
synchronize_session 选择策略来更新对象中的对象的属性 会议。有效值为:
否-不同步会话。此选项是最有效的,并且在会话过期后是可靠的,通常情况下 发生在commit()之后,或显式使用expire_all()。之前 过期后,更新的对象可能仍保留在会话中,且已过期 值的属性值,可能导致结果混乱。
因此,使用synchonize_session=False
,将不会在会话中更新数据库中更新的值。
'fetch'-在更新之前执行选择查询,以查找与更新查询匹配的对象。更新的属性 在匹配的对象上已过期。
传递fetch
使sqlalchemy识别会话中受更新影响的值,并且下次访问它们时,sqlalchemy将查询数据库以获取其更新值
'evaluate'-直接在会话中的对象上使用Python评估查询的条件。如果不评估标准 如果实施,则会引发异常。
在您的代码中,您没有为synchronize_session
指定值,所以默认值evaluate
适用。 Sqlalchemy无法找到不委托数据库就对模型进行ilike
的方法,因此它引发异常,使开发人员决定是否将会话中的值与数据库中的值同步。 / p>