sql >> Base de Datos >  >> RDS >> PostgreSQL

Configure SQLAlchemy para usar PostgreSQL SERIAL para la generación de identidades

Tu PRIMARY KEY debe definirse para usar una SEQUENCE como DEFAULT , ya sea a través del SERIAL pseudo-tipo de conveniencia:

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

o una SEQUENCE explícita :

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;

Esto es discutido en la documentación de SQLAlchemy .

Puede agregar esto a una tabla existente:

CREATE SEQUENCE blah_id_seq OWNED BY blah.id;

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

si prefiere restaurar un volcado, agregue secuencias manualmente.

Si hay datos existentes que ha cargado directamente en las tablas con COPY o similar, debe establecer el punto de inicio de la secuencia:

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

Diría que es probable que el problema tenga que ver con su desarrollo en SQLite, luego haga un volcado y restaure ese volcado en PostgreSQL. SQLAlchemy espera crear el esquema por sí mismo con los valores predeterminados y secuencias apropiados.

Lo que le recomiendo que haga en su lugar es obtener SQLAlchemy para crear una base de datos nueva y vacía. Volcar los datos de cada tabla de la base de datos SQLite a CSV, luego COPY esos datos en las tablas de PostgreSQL. Finalmente, actualice las secuencias con setval para que generen los valores adecuados.

De una forma u otra, usted necesitará para asegurarse de que se crean las secuencias adecuadas. Puedes hacerlo por SERIAL tipos de pseudo-columna, o por manual SEQUENCE creación y DEFAULT ajuste, pero usted debe hacerlo. De lo contrario, no hay forma de asignar una ID generada a la tabla de una manera eficiente y segura para la concurrencia.