Votre PRIMARY KEY
doit être défini pour utiliser une SEQUENCE
comme DEFAULT
, soit via le SERIAL
pseudo-type de commodité :
CREATE TABLE blah (
id serial primary key,
...
);
ou une SEQUENCE
explicite :
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;
Ceci est discuté dans la documentation SQLAlchemy .
Vous pouvez ajouter ceci à un tableau existant :
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
si vous préférez restaurer un dump, ajoutez les séquences manuellement.
S'il y a des données existantes que vous avez chargées directement dans les tables avec COPY
ou similaire, vous devez définir le point de départ de la séquence :
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Je dirais que le problème est probablement lié à votre développement dans SQLite, puis à la réalisation d'un vidage et à la restauration de ce vidage dans PostgreSQL. SQLAlchemy s'attend à créer le schéma lui-même avec les valeurs par défaut et les séquences appropriées.
Ce que je vous recommande de faire à la place, c'est que SQLAlchemy crée une nouvelle base de données vide. Videz les données de chaque table de la base de données SQLite vers CSV, puis COPY
ces données dans les tables PostgreSQL. Enfin, mettez à jour les séquences avec setval
afin qu'ils génèrent les valeurs appropriées.
D'une manière ou d'une autre, vous aurez besoin pour vous assurer que les séquences appropriées sont créées. Vous pouvez le faire par SERIAL
types pseudo-colonnes, ou par SEQUENCE
manuel création et DEFAULT
paramètre, mais vous devez le faire. Sinon, il n'y a aucun moyen d'attribuer un ID généré à la table de manière efficace et sans danger pour la concurrence.