sql >> Databasteknik >  >> RDS >> PostgreSQL

Ställ in SQLAlchemy att använda PostgreSQL SERIAL för identitetsgenerering

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.



  1. Hur man delar upp Oracle sql-satser för ADO.NET

  2. Implementering av fulltextsökning i SQL Server 2016 för nybörjare

  3. Korrekt sätt att ladda upp binär fil till MySQL genom Spring MVC

  4. Nätverksadaptern kunde inte upprätta anslutningen vid anslutning till Oracle DB