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.