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()
搜了下找到《Sqlalchemy delete subquery》這個問題,提到了 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 參數會更快。