3

データベースとしてpostgresqlを使用して、Django 1.4を使用しています。次のモデルがあります。

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

次のようなコードを使用して、bulk_create を使用して、別のデータベースのデータを django データベースに入力しています。

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 に別の値で主キーのインクリメントを開始させる方法、またはこの競合を解決する方法はありますか?

4

2 に答える 2

6

Postgresqlの自動インクリメント ロジックで次の ID を Django の外部で設定することで、この問題を解決しました。setval質問Postgresql setting next id to writeHow to reset postgres' primary key sequence when it fails out of syncと同様のコマンドを使用します。 ? .

私の例では、psqlでコマンドを実行する必要があります

select setval('keyword_id_seq', 3); 

ここkeyword_id_seqで、 は自動インクリメント シーケンスの名前 (デフォルトでは<table_name>_<column_name>_seq') で、6965 はテーブルに存在する最大 ID です。そうすれば、自動インクリメントは次の ID (この場合は 4) から開始され、競合は発生しません。

于 2013-01-09T19:21:21.643 に答える
2

id独自のフィールドを追加して主キーとしてマークすることで、自動インクリメント主キーを含むデフォルトのモデル動作をオーバーライドできます。例えば:

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

ドキュメント:自動主キー

于 2013-01-08T22:18:26.103 に答える