2016-02-29 95 views
3

我有一個大型數據庫的元素,每個元素都有唯一鍵。每隔一段時間(每分鐘一次),我都會加載更多需要添加到數據庫的項目,但如果它們與數據庫中已存在的項目重複,則會被丟棄。添加元素到Django數據庫

我的問題是 - 是不是更好?:

  1. 獲取的Django給我一個清單(或設置)中的所有獨特的鍵,然後的,嘗試添加每個新項目之前,檢查它的密鑰是否在列表中,或者
  2. 圍繞新項目的保存調用有一個try/except語句,並且在Django上捕獲重複項的回覆?

乾杯, 傑克

回答

1

如果你使用MySQL,你有INSERT IGNORE權力在你的指尖,這將是最高效的解決方案。您可以直接使用遊標API執行自定義SQL查詢。 (https://docs.djangoproject.com/en/1.9/topics/db/sql/#executing-custom-sql-directly

如果您使用的是Postgres或一些其他數據的存儲,支持INSERT IGNORE那麼事情會更復雜一些。

在Postgres的情況下,你可以使用規則來製作你自己的版本INSERT IGNORE

這將是這個樣子:

CREATE RULE "insert_ignore" AS ON INSERT TO "some_table" 
WHERE EXISTS (SELECT 1 FROM some_table WHERE pk=NEW.pk) DO INSTEAD NOTHING; 

不管你做什麼,避免「選擇所有行和首先檢查辦法」爲最壞情況下的性能是O(n)在Python,基本上短期因爲檢查是在應用程序機器上執行的(並且最終還會受到內存限制),所以可以利用數據庫提供的任何性能優勢。

try/except方法比「select all rows」方法略好,但它仍然需要不斷切換到應用服務器來處理每個衝突,儘管速度更快。最好讓數據庫完成這項工作。

+0

很好的答案,謝謝 – JMzance