Sua
PRIMARY KEY
deve ser definido para usar uma SEQUENCE
como um DEFAULT
, seja por meio do SERIAL
pseudo-tipo de conveniência:CREATE TABLE blah (
id serial primary key,
...
);
ou uma
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;
Isso é discutido na documentação do SQLAlchemy .
Você pode adicionar isso a uma tabela existente:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
se você preferir restaurar um dump, adicione as sequências manualmente.
Se houver dados existentes, você carregou diretamente nas tabelas com
COPY
ou similar, você precisa definir o ponto de partida da sequência:SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Eu diria que o problema provavelmente está relacionado ao seu desenvolvimento no SQLite, depois fazendo um dump e restaurando esse dump para o PostgreSQL. SQLAlchemy espera criar o esquema por conta própria com os padrões e sequências apropriados.
O que eu recomendo que você faça é obter SQLAlchemy para criar um novo banco de dados vazio. Despeje os dados de cada tabela do banco de dados SQLite para CSV e, em seguida,
COPY
esses dados nas tabelas do PostgreSQL. Por fim, atualize as sequências com setval
para que eles gerem os valores apropriados. De uma forma ou de outra, você precisará para certificar-se de que as seqüências apropriadas sejam criadas. Você pode fazer isso por
SERIAL
tipos de pseudo-coluna ou por SEQUENCE
manual criação e DEFAULT
configuração, mas você deve fazê-lo. Caso contrário, não há como atribuir um ID gerado à tabela de maneira eficiente e segura de simultaneidade.