PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Definir SQLAlchemy para usar PostgreSQL SERIAL para geração de identidade


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.