Din PRIMARY KEY
skal defineres til at bruge en SEQUENCE
som en DEFAULT
, enten via SERIAL
bekvemmelighed pseudo-type:
CREATE TABLE blah (
id serial primary key,
...
);
eller en eksplicit 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;
Dette er diskuteret i SQLAlchemy-dokumentationen .
Du kan tilføje dette til en eksisterende tabel:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
hvis du foretrækker at gendanne et dump, så tilføj sekvenser manuelt.
Hvis der er eksisterende data, har du indlæst direkte i tabellerne med COPY
eller lignende, skal du indstille sekvensens startpunkt:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Jeg vil sige, at problemet sandsynligvis er at gøre med din udvikling i SQLite, så laver du et dump og genopretter det dump til PostgreSQL. SQLAlchemy forventer selv at skabe skemaet med de passende standardindstillinger og sekvenser.
Det, jeg anbefaler, du gør i stedet, er at få SQLAlchemy til at oprette en ny, tom database. Dump dataene for hver tabel fra SQLite DB til CSV, og derefter COPY
disse data ind i PostgreSQL-tabellerne. Til sidst skal du opdatere sekvenserne med setval
så de genererer de passende værdier.
På den ene eller den anden måde vil du bruge for at sikre, at de passende sekvenser oprettes. Du kan gøre det ved at bruge SERIAL
pseudo-søjletyper eller ved manuel SEQUENCE
oprettelse og DEFAULT
indstilling, men du skal gøre det. Ellers er der ingen måde at tildele et genereret ID til tabellen på en effektiv, samtidighedssikker måde.