为什么synchronize_session="fetch"适用于SQLAlchemy Query API而不是CORE?

问题描述 投票:0回答:1

我在 SQLAlchemy (Postgresql) 中编写了一个查询,这是一个简单的更新,但它对其中一个条件使用了强制转换,如下所示:

stmt = (
   update(MyModel).
   where(
     func.cast(MyModel.last_mod, Date) == current_week_minus_one,
     MyModel.deleted.is_(False)
   ).
   values(
      deleted=True,
      notification_s=True
   )
session.execute(stmt)
session.commit()
 

但是这一直给我带来错误:

"Cannot evaluate Cast". Specify 'fetch' or False for the synchronize_session execution option

所以我将

synchronize_session="fetch"
放入执行语句中,如下所示:

session.execute(stmt, synchronize_session="fetch") 

但是我仍然遇到同样的错误。然后我查看了 this SO 帖子,答案是使用查询 API 而不是 SQLAlchemy CORE 来解决它。所以我将代码更改为:

stmt = (
   session.query(MyModel).
   filter(
     func.cast(MyModel.last_mod, Date) == current_week_minus_one,
     MyModel.deleted.is_(False)
   ).
   update(
      {MyModel.deleted: True,
      MyModel.notification_s:True},
     synchronize_session="fetch"

   )
session.commit()
 

现在它可以工作了,但我不清楚为什么我不能使用 SQLALchemy CORE 来做到这一点。

postgresql sqlalchemy
1个回答
0
投票

在 SQLAlchemy 2.0+ 中,同步方法作为执行选项传递给

Session.execute

session.execute(stmt, execution_options={'synchronize_session': 'fetch'})

请注意,虽然 SQLAlchemy 2.0 查询语法对于 ORM 或核心层或多或少相同,但会话仅是 ORM 层的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.