sql >> Database teknologi >  >> RDS >> PostgreSQL

Indstil SQLAlchemy til at bruge PostgreSQL SERIAL til identitetsgenerering

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.



  1. Hvordan bruger man GROUP BY til at sammenkæde strenge i SQL Server?

  2. MySQL varchar indekslængde

  3. At have Timeout for at få en forbindelse efter opgradering af Knex

  4. MySQL-indekser - hvad er den bedste praksis i henhold til denne tabel og forespørgsler