2013-01-08 60 views
3

我使用Django 1.4,在PostgreSQL作爲數據庫,和我有以下型號:Django的一個bulk_create後1.4主鍵衝突

class Keyword(models.Model): 
    name = models.CharField(max_length=100) 

我用數據填充Django的數據庫,從另一個數據庫中,使用bulk_create, 類似於一些代碼:

Keyword.objects.bulk_create([Keyword(id=id, name=name) for id,name in [(1,"k1"),(2,"k2"),(3,"k3")] ]) 

遺留數據具有主鍵已經,並保持這種方式是很重要的。

的問題是,當我嘗試創建新的對象,Django會使用主鍵從1開始,併發生衝突異常被拋出:

k = Keyword(name="k4") 
k.save() 

給我的錯誤

IntegrityError: duplicate key value violates unique constraint "sinbiota_keyword_pkey" 
DETAIL: Key (id)=(1) already exists. 

有沒有辦法強制Django以另一個值開始主鍵增量,或者有任何方法來解決這個衝突?

回答

6

我設置下一個ID PostgreSQL中的自動遞增邏輯,Django的以外,使用setval命令,類似問題Postgresql setting next id to write toHow to reset postgres' primary key sequence when it falls out of sync?解決了這個問題。

在我的例子,我會在PSQL執行命令

select setval('keyword_id_seq', 3); 

其中keyword_id_seq是自動遞增序列的名稱(默認情況下,<table_name>_<column_name>_seq'),和6965是目前的最大ID桌子。這樣, 自動增量從下一個id開始(在這種情況下爲4)並且不會發生衝突。

2

您可以通過添加您自己的id字段並將其標記爲主鍵來覆蓋包含自動遞增主鍵的默認模型行爲。 E.g:

class Keyword(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100) 

文檔:Automatic Primary Keys

+0

但我認爲這意味着我將不得不創建自己的主鍵邏輯,這實際上是我不想做的事情。我實際上在這裏找到了我的解決方案,很快就會發布。 –