PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Définir SQLAlchemy pour utiliser PostgreSQL SERIAL pour la génération d'identité

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.