One - One Code All

Blog Content

flask,sqlalchemy中使用in_,报错Cannot evaluate clauselist,synchronize_session

Python   2017-04-24 21:08:13

flask,sqlalchemy中使用in_,报错Cannot evaluate clauselist,synchronize_session

解决方案:使用synchronize_session,

synchronize_session='fetch' 或 synchronize_session=False


更新语句是这样的:

 result = Doctor.query.filter(Doctor.department_id==department_id).filter(Doctor.id.in_(tuple(doctor_ids))).update({"department_id":None})

执行的时候报错


sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python: "Cannot evaluate clauselist with operator ". Specify 'fetch' or False for the synchronize_session parameter. Traceback (most recent call last):


解决方法是:

result = Doctor.query\
            .filter(Doctor.department_id==department_id) \
            .filter(Doctor.id.in_(tuple(doctor_ids))) \
            .update({"department_id":None}, synchronize_session='fetch')

为什么无法操作 in 操作查询出来的记录?

session.query(User).filter(User.id.in_((1, 2, 3))).delete()

抛出这样的异常:

sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python.  Specify 'fetch' or False for the synchronize_session parameter.

但这样是没问题的:

session.query(User).filter(or_(User.id == 1, User.id == 2, User.id == 3)).delete()

Sqlalchemy delete subquery注意点:删除记录时,默认会尝试删除 session 中符合条件的对象,而 in 操作估计还不支持,于是就出错了。解决办法就是删除时不进行同步,然后再让 session 里的所有实体都过期:

session.query(User).filter(User.id.in_((1, 2, 3))).delete(synchronize_session=False)
session.commit() # or session.expire_all()


此外,update 操作也有同样的参数,如果后面立刻提交了,那么加上 synchronize_session=False 参数会更快。



上一篇:flask登录注册token验证接口开发详解
下一篇:flask,SQLAlchemy的in和not in等查询方式总结

The minute you think of giving up, think of the reason why you held on so long.