sqlachemy中批量刪除的問題

2021-09-07 17:48:13 字數 1527 閱讀 4154

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 引數會更快。

大資料中的批量刪除

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...