我在 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 来做到这一点。
在 SQLAlchemy 2.0+ 中,同步方法作为执行选项传递给
Session.execute
:
session.execute(stmt, execution_options={'synchronize_session': 'fetch'})
请注意,虽然 SQLAlchemy 2.0 查询语法对于 ORM 或核心层或多或少相同,但会话仅是 ORM 层的一部分。