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.