sqlachemy中批量删除的问题

db.session.query(Article).filter(Article.id.in_(items)).delete()

报错:

sqlalchemy.exc.InvalidRequestError

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

但是:

db.session.query(Article).filter(Article.id==1).delete() db.session.query(Article).filter(Article.id.in_(items))

都能得到正确的结果。为什么不能直接使用.delete()?

我按下面的写法能正常工作。

art_items=Article.query.filter(Article.id.in_(items))
for item in art_items: db.session.delete(item) db.session.commit()

就是希望了解一下原理。为什么不能在使用_in的时候直接后面接delete()?


为什么无法删除 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()

搜了下找到这个问题,提到了 delete 的一个注意点:删除记录时,默认会尝试删除 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 参数会更快。

db.session.query(Article).filter(Article.id.in_(items)).delete() 报错: sqlalchemy.exc.InvalidRequestError InvalidRequestError: Could not evaluate current criteria in Python. Specify fetch or False for the synchronize_session parameter. 但是: db.session.query(Article).filter(Article.id==1).delete() db.session.query(Article).filter(Article.id.in_(items)) 都能得到正确的结果。为什么不能直接使用.delete()? 我按下面的写法能正常工作。 art_items=Article.query.filter(Article.id.in_(items)) for item in art_items: db.session.delete(item) db.session.commit() 就是希望了解一下原理。为什么不能在使用_in的时候直接后面接delete()? 为什么无法删除 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() 搜了下找到这个问题,提到了 delete 的一个注意点:删除记录时,默认会尝试删除 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 参数会更快。
经验分享 程序员 微信小程序 职场和发展