Вашият PRIMARY KEY
трябва да се дефинира да използва SEQUENCE
като DEFAULT
, или чрез SERIAL
удобен псевдотип:
CREATE TABLE blah (
id serial primary key,
...
);
или изрично 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;
Това е обсъдено в документацията на SQLAlchemy .
Можете да добавите това към съществуваща таблица:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
ако предпочитате да възстановите дъмп, добавете последователности ръчно.
Ако има съществуващи данни, които сте заредили директно в таблиците с COPY
или подобно, трябва да зададете начална точка на последователността:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Бих казал, че проблемът вероятно е свързан с вашата разработка в SQLite, след което правите дъмп и възстановявате този дъмп в PostgreSQL. SQLAlchemy очаква да създаде самата схема със съответните настройки по подразбиране и последователности.
Това, което препоръчвам да направите вместо това, е да накарате SQLAlchemy да създаде нова, празна база данни. Изхвърлете данните за всяка таблица от SQLite DB в CSV, след което COPY
тези данни в таблиците на PostgreSQL. Накрая актуализирайте последователностите с setval
така че генерират подходящите стойности.
По един или друг начин ще трябвате за да се уверите, че са създадени подходящите последователности. Можете да го направите чрез SERIAL
типове псевдо-колони или чрез ръчно SEQUENCE
създаване и DEFAULT
настройка, но трябва да го направите. В противен случай няма начин да присвоите генериран идентификатор на таблицата по ефективен, безопасен за едновременност начин.