PRIMARY KEY
SEQUENCE
を使用するように定義する必要があります DEFAULT
として 、SERIAL
経由のいずれか 便利な疑似タイプ:
CREATE TABLE blah (
id serial primary key,
...
);
または明示的なSEQUENCE
:
CREATE SEQUENCE blah_id_seq;
CREATE TABLE blah (
id integer primary key default nextval('blah_id_seq'),
...
);
ALTER SEQUENCE blah_id_seq OWNED BY blah.id;
これは、SQLAlchemyのドキュメントで説明されています です。 。
これを既存のテーブルに追加できます:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
ダンプを復元したい場合は、シーケンスを手動で追加してください。
COPY
を使用してテーブルに直接ロードした既存のデータがある場合 または同様に、シーケンスの開始点を設定する必要があります:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
問題は、SQLiteで開発し、ダンプを実行して、そのダンプをPostgreSQLに復元することに関係している可能性が高いと思います。 SQLAlchemyは、適切なデフォルトとシーケンスを使用してスキーマを独自に作成することを期待しています。
代わりに、SQLAlchemyに新しい空のデータベースを作成させることをお勧めします。各テーブルのデータをSQLiteDBからCSVにダンプしてから、COPY
そのデータをPostgreSQLテーブルに入れます。最後に、setval
でシーケンスを更新します したがって、適切な値を生成します。
いずれにせよ、あなたは必要 適切なシーケンスが作成されていることを確認します。あなたはSERIAL
によってそれをすることができます 疑似列タイプ、または手動のSEQUENCE
作成とDEFAULT
設定しますが、あなたはそれをしなければなりません。そうでなければ、生成されたIDを効率的で並行性に安全な方法でテーブルに割り当てる方法はありません。