PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Legen Sie SQLAlchemy fest, um PostgreSQL SERIAL für die Identitätsgenerierung zu verwenden

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.