Ihr PRIMARY KEY
sollte definiert werden, um eine SEQUENCE
zu verwenden als DEFAULT
, entweder über SERIAL
Convenience-Pseudotyp:
CREATE TABLE blah (
id serial primary key,
...
);
oder eine explizite 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;
Dies wird in der SQLAlchemy-Dokumentation behandelt .
Sie können dies zu einer bestehenden Tabelle hinzufügen:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
Wenn Sie lieber einen Dump wiederherstellen möchten, fügen Sie Sequenzen manuell hinzu.
Falls Daten vorhanden sind, haben Sie diese direkt mit COPY
in die Tabellen geladen oder ähnlich, müssen Sie den Startpunkt der Sequenz festlegen:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Ich würde sagen, das Problem hat wahrscheinlich damit zu tun, dass Sie in SQLite entwickeln, dann einen Dump erstellen und diesen Dump in PostgreSQL wiederherstellen. SQLAlchemy erwartet, das Schema selbst mit den entsprechenden Standardwerten und Sequenzen zu erstellen.
Ich empfehle Ihnen stattdessen, SQLAlchemy dazu zu bringen, eine neue, leere Datenbank zu erstellen. Sichern Sie die Daten für jede Tabelle aus der SQLite-DB in CSV, dann COPY
diese Daten in die PostgreSQL-Tabellen. Aktualisieren Sie abschließend die Sequenzen mit setval
damit sie die entsprechenden Werte generieren.
Auf die eine oder andere Weise werden Sie brauchen um sicherzustellen, dass die entsprechenden Sequenzen erstellt werden. Sie können dies mit SERIAL
tun Pseudospaltentypen oder durch manuelle SEQUENCE
Erstellung und DEFAULT
Einstellung, aber Sie müssen es tun. Andernfalls gibt es keine Möglichkeit, der Tabelle eine generierte ID auf effiziente, parallelitätssichere Weise zuzuweisen.