You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何synchronize_session="fetch"在SQLAlchemy Query API可用却无法用于CORE?

SQLAlchemy Core UPDATE用Cast报错?问题出在参数位置

问题根源

你之前用Core写UPDATE时,把synchronize_session参数传给了session.execute()——这完全错了!这个参数是Core的update()语句对象的配置项,不是execute()的参数。

SQLAlchemy Core的update()是独立的SQL构造器,默认不会自动处理内存对象和数据库的同步。错误提示里要求的synchronize_session,得通过execution_options()绑定到update()语句上,而不是随便传给执行方法。

Core的正确写法

把synchronize_session放到update()的execution_options里就行,两种可选配置:

1. 同步内存对象(fetch模式)

stmt = (
    update(MyModel)
    .where(
        func.cast(MyModel.last_mod, Date) == current_week_minus_one,
        MyModel.deleted.is_(False)
    )
    .values(
        deleted=True,
        notification_s=True
    )
    # 这里才是正确的参数位置
    .execution_options(synchronize_session="fetch")
)
session.execute(stmt)
session.commit()

2. 跳过同步(性能更优)

如果不需要更新内存里的MyModel实例,直接设为False就行:

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

为啥Query API能跑通?

Query API的update()方法本身就把synchronize_session作为参数暴露出来了,你调用query(...).update(..., synchronize_session="fetch")时,参数直接传给了内部处理同步的逻辑,自然能正确解析Cast表达式完成更新。

而Core是更底层的SQL工具,设计上默认不处理会话同步,必须显式通过execution_options()配置,这就是两者的核心差异。

内容的提问来源于stack exchange,提问作者mp252

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:53:24