2011-02-01 742 views
22

設置:
Django的1.1.2中,MySQL 5.1如何使Django的查詢集批量刪除()更有效

問題:

Blob.objects.filter(foo = foo) \ 
      .filter(status = Blob.PLEASE_DELETE) \ 
      .delete() 

在ORM此代碼段的結果首先產生一個SELECT * from xxx_blob where ...查詢,然後做一個DELETE from xxx_blob where id in (BLAH);,其中BLAH是一個很可笑的ID列表。由於我刪除了大量的斑點,這使得我和DB都非常不高興。

這是有原因嗎?我不明白爲什麼ORM無法將上述片段轉換爲單個DELETE查詢。有沒有一種方法來優化,而不訴諸原始SQL?

回答

13

不是沒有編寫自己的自定義SQL或管理器或東西;他們顯然正在努力。

http://code.djangoproject.com/ticket/9519

+0

這確實是不幸的。感謝您指點我的票。 – svintus 2011-02-06 18:48:11

+1

門票給出了你想要的理由。這並不完全沒有好處。 – 2013-03-11 20:07:56

3

Bulk delete已經是Django的

+4

Queryset.delete()的行爲如同OP描述的那樣。 – 2012-10-24 12:41:53

9

的一部分,對於那些誰仍然在尋找一種有效的方式來批量刪除Django的,這裏有一個可能的解決方案:

原因刪除()可能這麼慢是雙重的:1)django必須確保級聯刪除功能正確,因此尋找您的模型的外鍵引用; 2)django必須處理模型的保存前和保存後信號。

如果你知道你的模型沒有級聯刪除或信號進行處理,可以訴諸私有API _raw_delete如下加快這一進程:在here

queryset._raw_delete(queryset.db) 

更多細節。請注意,django已經試圖很好地處理這些事件,儘管在很多情況下使用原始刪除的效率更高。