PRIMARY KEY harus didefinisikan menggunakan SEQUENCE sebagai DEFAULT , baik melalui SERIAL tipe pseudo kenyamanan:
CREATE TABLE blah (
id serial primary key,
...
);
atau SEQUENCE yang eksplisit :
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;
Ini dibahas dalam dokumentasi SQLAlchemy .
Anda dapat menambahkan ini ke tabel yang ada:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
jika Anda lebih suka memulihkan dump, tambahkan urutan secara manual.
Jika ada data yang Anda muat langsung ke tabel dengan COPY atau serupa, Anda perlu mengatur urutan titik awal:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Saya akan mengatakan masalahnya mungkin berkaitan dengan pengembangan Anda di SQLite, kemudian melakukan dump dan memulihkan dump itu ke PostgreSQL. SQLAlchemy mengharapkan untuk membuat skema sendiri dengan default dan urutan yang sesuai.
Yang saya sarankan Anda lakukan adalah membuat SQLAlchemy membuat database baru yang kosong. Buang data untuk setiap tabel dari SQLite DB ke CSV, lalu COPY data itu ke dalam tabel PostgreSQL. Terakhir, perbarui urutannya dengan setval sehingga mereka menghasilkan nilai yang sesuai.
Dengan satu atau lain cara, Anda akan membutuhkan untuk memastikan bahwa urutan yang sesuai dibuat. Anda dapat melakukannya dengan SERIAL jenis pseudo-kolom, atau dengan SEQUENCE manual pembuatan dan DEFAULT pengaturan, tetapi Anda harus melakukannya. Jika tidak, tidak ada cara untuk menetapkan ID yang dihasilkan ke tabel dengan cara yang efisien dan aman secara serentak.