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.