SQLAlchemy日期过滤更新遇Cast报错,如何通过synchronize_session解决?
SQLAlchemy更新语句添加日期过滤时的Cast错误解决方法
问题描述
现有可正常执行的SQLAlchemy更新语句:
db.query(data).filter(data.id==o['id']).update({data.count:o['list']})
需要新增日期过滤条件:基于今日日期(today),与data表中datetime类型的created_at列比较,仅更新符合条件的数据。
尝试两种含cast转换的写法均触发错误:
1.
db.query(data).filter(data.id==o['id']).filter(cast(data.created_at,Date)==today).update({data.count:o['list']})
db.query(data).filter(data.id==o['id'],data.created_at.cast(Date)==today).update({data.count:o['list']})
错误信息:
Could not evaluate current criteria in Python: "Cannot evaluate Cast". Specify 'fetch' or False for the synchronize_session execution option
解决方法
这个错误源于SQLAlchemy默认会尝试在Python端评估查询条件以同步会话,但Cast表达式无法在Python本地计算。以下是几种解决方式:
方式1:指定synchronize_session参数
在update()方法中显式设置synchronize_session参数,可选值为'fetch'或False:
synchronize_session=False:关闭会话同步,适合不需要立即同步内存中对象状态的场景
db.query(data).filter(data.id==o['id']).filter(cast(data.created_at, Date)==today).update( {data.count: o['list']}, synchronize_session=False )
synchronize_session='fetch':先查询符合条件的对象同步到会话,再执行更新,适合需要保持内存对象与数据库状态一致的场景
db.query(data).filter(data.id==o['id']).filter(cast(data.created_at, Date)==today).update( {data.count: o['list']}, synchronize_session='fetch' )
方式2:避免Cast(推荐)
利用SQLAlchemy的func.date()函数直接提取日期进行比较,无需类型转换,也能规避会话同步问题:
from sqlalchemy import func db.query(data).filter(data.id==o['id']).filter(func.date(data.created_at)==today).update( {data.count: o['list']} )
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

