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() 

搜了下找到《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 參數會更快。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM