db.session.query(article).filter(article.id.in_(items)).delete()
報錯:
sqlalchemy.exc.invalidrequesterrorinvalidrequesterror: 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))就是希望了解一下原理。為什麼不能在使用_in的時候直接後面接delete()?for item in art_items: db.session.delete(item) db.session.commit()
為什麼無法刪除 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 引數會更快。 大資料中的批量刪除
oken表中目前有400w條資料,且以每天十幾萬的資料繼續增長。需要定期將其中過期的資料取消掉,僅保留最新的萬計以內的資料 token表有兩個字段 id long 自增 update time timestamp,更新時間 其中在id上建立了索引 一次性刪除掉400w條資料顯然不靠譜,會發現刪除失敗...
redis中批量刪除key
1 刪除所有的key,可以使用redis自身的命令 flushdb 刪除當前資料庫中的所有key flushall 刪除所有資料庫中的key 2 使用linux中的xargs來刪除所有的key redis cli keys xargs redis cli del 3 刪除包含有某些關鍵字的key r...
hibernate的批量更新 批量刪除
hibernate的批處理api session.createquery hql executeupdate 如果有引數則在執行之前設定引數。批量更新示例 test public void testbatchupdate 批量刪除示例 test public void testbatchdelete...