SQLAlchemy-无法使用运算符评估BinaryExpression

时间:2018-07-07 09:17:44

标签: python sqlalchemy

我正在尝试使用以下代码更新表中的某些记录:

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的用途是什么?

1 个答案:

答案 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>