2014-01-10 31 views
0

想象2行:Django的.delete()方法之後。所有()

Model.objects.all().delete() 

Model.objects.delete() 

是否有在執行流中的任何差? DB服務器是Mysql(Amazon RDBMS)。

第一行是否會首先加載所有對象,並逐個刪除它們?或'truncate'命令將被執行?

而且,最重要 - 如果由於某些原因第一行在其執行期間會被中斷會怎麼樣?例如,我們有一個有很多記錄的大表。如果我們執行第一行並且腳本將被殺死 - 這是否意味着一些記錄將被刪除,而有些則不是?

謝謝!

回答

0

正如queryset documentation規定,刪除():

執行一個SQL刪除在查詢集的所有行查詢。

由於查詢集在使用之前不會被解析,因此這些對象不會一個一個地被刪除,而且它們各自的刪除方法也不會被使用。

+0

謝謝,但該對象將如何被刪除?一個接一個還是全部記錄?換句話說,這是一個原子操作還是不是?如果我們說,表中還有一些記錄 - 這是否意味着沒有記錄被刪除? – Spaceman

3

不要以爲有Model.objects.delete()方法。從docs

注意delete()是唯一QuerySet方法未在 一個經理本身暴露出來。這是一種安全機制,可以防止您從 意外請求Entry.objects.delete(),並刪除所有 條目。如果你想刪除所有的對象,那麼你必須 明確要求一個完整的查詢集: Entry.objects.all().delete()

同樣,Django的嘗試,使之爲SQL語句的文件中提到,所以它可能不會在刪除之前取出單個記錄(也可以不調用.delete()模型的方法,如果它被覆蓋的話)。

相關問題