批量更新查詢集
假設我們想要從 id 51
的作者的所有文章中刪除 2 個 upvotes。
僅使用 Python 執行此操作將執行 N
查詢(N
是查詢集中的文章數):
for article in Article.objects.filter(author_id=51):
article.upvotes -= 2
article.save()
# Note that there is a race condition here but this is not the focus
# of this example.
如果不是將所有文章都引入 Python,迴圈遍歷它們,減少 upvotes,並將每個更新的文章儲存回資料庫,還有另一種方法嗎?
使用 F()
表示式,可以在一個查詢中執行:
Article.objects.filter(author_id=51).update(upvotes=F('upvotes') - 2)
哪個可以在以下 SQL 查詢中翻譯:
UPDATE app_article SET upvotes = upvotes - 2 WHERE author_id = 51
為什麼這樣更好?
- 我們將負載傳遞到資料庫中,而不是使用 Python 來完成工作,資料庫經過精心調整以進行此類查詢。
- 有效減少實現所需結果所需的資料庫查詢數量。