Din PRIMARY KEY
bör definieras för att använda en SEQUENCE
som en DEFAULT
, antingen via SERIAL
bekvämlighet pseudo-typ:
CREATE TABLE blah (
id serial primary key,
...
);
eller en explicit 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;
Detta diskuteras i SQLAlchemy-dokumentationen .
Du kan lägga till detta i en befintlig tabell:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
om du föredrar att återställa en dump, lägg till sekvenser manuellt.
Om det finns befintliga data har du laddat direkt in i tabellerna med COPY
eller liknande, måste du ställa in sekvensens startpunkt:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Jag skulle säga att problemet troligen har att göra med att du utvecklar i SQLite, sedan gör du en dumpning och återställer den dumpen till PostgreSQL. SQLAlchemy förväntar sig att skapa schemat själv med lämpliga standardvärden och sekvenser.
Det jag rekommenderar att du gör istället är att få SQLAlchemy att skapa en ny, tom databas. Dumpa data för varje tabell från SQLite DB till CSV och sedan COPY
dessa data till PostgreSQL-tabellerna. Uppdatera slutligen sekvenserna med setval
så de genererar lämpliga värden.
På ett eller annat sätt behöver du för att se till att lämpliga sekvenser skapas. Du kan göra det med SERIAL
pseudo-kolumntyper, eller med manuell SEQUENCE
skapande och DEFAULT
inställning, men du måste göra det. Annars finns det inget sätt att tilldela ett genererat ID till tabellen på ett effektivt, samtidighetssäkert sätt.