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.