2

背景: Django アプリ (Django 1.1.1、Python2.4、psycopg2、および Postgres 8.1) 用の PostgreSQL データベースの実行 SQL ダンプからデータベースを数回復元しました。それを行ってから、シェル、管理者、またはサイトフロントエンドのいずれかで新しい行を追加しようとするたびに、次のエラーが発生します。

IntegrityError: duplicate key violates unique constraint "app_model_pkey"

データ ダンプは問題なく、シーケンスをリセットしています。しかし、もう一度行を追加しようとすると、成功します! したがって、すべてのテーブルに新しい行を詰め込むだけで、すべてが調和しているように見えます。

質問: (1) SQL ダンプが良好で、Postgres がそれを正しく読み込んでおり (以前の質問による)、(2) Django の ORM がシステム的に次の値を取得することに失敗していないように見える場合、この特定のインスタンスで何が起こっているのか?

4

2 に答える 2

2

あなたのシーケンスは古くなっていると思います。

次のように修正できます。

select setval('app_model_id_seq', max(id)) from app_model;
于 2010-07-05T02:37:40.907 に答える
2

Django は、シーケンス値を保持したり、直接読み取ったりしません。私はそれを説明しました。この質問: 2088210 /django-object-creation-and-postgres-sequences

行を追加しようとすると、Postgresql はシーケンスをインクリメントします。操作の結果が成功しない (重複キー エラーが発生する) 場合でも、シーケンスのインクリメントはロールバックしません。これが、2 回目に行を追加しようとしたときに機能する理由です。

シーケンスが正しく設定されていない理由がわかりません。ダンプ前と復元後のシーケンス値を確認し、テーブルの max() pk で同じことを行っていただけますか? 8.1 の復元のバグでしょうか? 知らない。私が確信しているのは、Django のせいではないということです。

于 2010-07-05T02:27:10.620 に答える