为何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
相关产品推荐
相关产品推荐

