Uw PRIMARY KEY
moet worden gedefinieerd om een SEQUENCE
. te gebruiken als een DEFAULT
, ofwel via de SERIAL
gemak pseudo-type:
CREATE TABLE blah (
id serial primary key,
...
);
of een expliciete 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;
Dit wordt besproken in de SQLAlchemy-documentatie .
U kunt dit toevoegen aan een bestaande tabel:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
als je liever een dump herstelt, voeg dan handmatig sequenties toe.
Als er bestaande gegevens zijn die u rechtstreeks in de tabellen hebt geladen met COPY
of iets dergelijks, moet u het startpunt van de reeks instellen:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Ik zou zeggen dat het probleem waarschijnlijk te maken heeft met het ontwikkelen in SQLite, het uitvoeren van een dump en het herstellen van die dump naar PostgreSQL. SQLAlchemy verwacht het schema zelf te maken met de juiste standaardwaarden en sequenties.
Wat ik u in plaats daarvan aanbeveel, is om SQLAlchemy een nieuwe, lege database te laten maken. Dump de gegevens voor elke tabel van de SQLite DB naar CSV, dan COPY
die gegevens in de PostgreSQL-tabellen. Werk ten slotte de reeksen bij met setval
zodat ze de juiste waarden genereren.
Op de een of andere manier heb je nodig om ervoor te zorgen dat de juiste reeksen worden gemaakt. Je kunt het doen door SERIAL
pseudo-kolomtypes, of handmatig SEQUENCE
creatie en DEFAULT
instelling, maar u moet het doen. Anders is er geen manier om een gegenereerde ID op een efficiënte, gelijktijdigheidsveilige manier aan de tabel toe te wijzen.