Váš PRIMARY KEY
by měl být definován tak, aby používal SEQUENCE
jako DEFAULT
, buď prostřednictvím SERIAL
pohodlí pseudotyp:
CREATE TABLE blah (
id serial primary key,
...
);
nebo explicitní SEQUENCE
:
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;
Toto je diskutováno v dokumentaci SQLAlchemy .
Toto můžete přidat do existující tabulky:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
pokud dáváte přednost obnovení výpisu, přidejte sekvence ručně.
Pokud existují data, která jste načetli přímo do tabulek pomocí COPY
nebo podobně, musíte nastavit počáteční bod sekvence:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Řekl bych, že problém bude pravděpodobně souviset s vaším vývojem v SQLite, následným provedením výpisu a obnovením tohoto výpisu do PostgreSQL. SQLAlchemy očekává, že vytvoří schéma samo o sobě s příslušnými výchozími hodnotami a sekvencemi.
Doporučuji vám místo toho nechat SQLAlchemy vytvořit novou prázdnou databázi. Uložte data pro každou tabulku z SQLite DB do CSV a poté COPY
tato data do tabulek PostgreSQL. Nakonec aktualizujte sekvence pomocí setval
takže generují příslušné hodnoty.
Tak či onak to budete potřebovat abyste se ujistili, že jsou vytvořeny příslušné sekvence. Můžete to udělat pomocí SERIAL
pseudosloupcové typy, nebo ručně SEQUENCE
vytvoření a DEFAULT
nastavení, ale musíte to udělat. Jinak neexistuje způsob, jak přiřadit vygenerované ID tabulce účinným a souběžně bezpečným způsobem.