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

Imposta SQLAlchemy per utilizzare PostgreSQL SERIAL per la generazione di identità

La tua PRIMARY KEY dovrebbe essere definito per usare una SEQUENCE come DEFAULT , sia tramite il SERIAL pseudo-tipo di convenienza:

CREATE TABLE blah (
    id serial primary key,
    ...
);

o una SEQUENCE esplicita :

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;

Questo è discusso nella documentazione di SQLAlchemy .

Puoi aggiungerlo a una tabella esistente:

CREATE SEQUENCE blah_id_seq OWNED BY blah.id;

ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');

se preferisci ripristinare un dump, aggiungi le sequenze manualmente.

Se sono presenti dati che hai caricato direttamente nelle tabelle con COPY o simili, è necessario impostare il punto di partenza della sequenza:

SELECT setval('blah_id_seq', max(id)+1) FROM blah;

Direi che è probabile che il problema riguardi lo sviluppo in SQLite, quindi l'esecuzione di un dump e il ripristino di quel dump su PostgreSQL. SQLAlchemy prevede di creare lo schema da solo con le impostazioni predefinite e le sequenze appropriate.

Quello che ti consiglio di fare invece è ottenere SQLAlchemy per creare un nuovo database vuoto. Scarica i dati per ciascuna tabella dal DB SQLite in CSV, quindi COPY quei dati nelle tabelle PostgreSQL. Infine, aggiorna le sequenze con setval quindi generano i valori appropriati.

In un modo o nell'altro, avrai necessità per assicurarsi che vengano create le sequenze appropriate. Puoi farlo tramite SERIAL tipi di pseudo-colonna o tramite SEQUENCE manuale creazione e DEFAULT impostazione, ma devi farlo. Altrimenti non c'è modo di assegnare un ID generato alla tabella in modo efficiente e sicuro per la concorrenza.