Twój PRIMARY KEY należy zdefiniować tak, aby używał SEQUENCE jako DEFAULT , albo przez SERIAL pseudo-typ wygody:
CREATE TABLE blah (
id serial primary key,
...
);
lub jawna 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;
Jest to omówione w dokumentacji SQLAlchemy .
Możesz dodać to do istniejącej tabeli:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
jeśli wolisz przywrócić zrzut, dodaj sekwencje ręcznie.
Jeśli istnieją dane, które załadowałeś bezpośrednio do tabel za pomocą COPY lub podobny, musisz ustawić punkt początkowy sekwencji:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Powiedziałbym, że problem może dotyczyć programowania w SQLite, a następnie wykonania zrzutu i przywrócenia tego zrzutu do PostgreSQL. SQLAlchemy spodziewa się stworzyć sam schemat z odpowiednimi wartościami domyślnymi i sekwencjami.
Zamiast tego zalecam, aby SQLAlchemy utworzył nową, pustą bazę danych. Zrzuć dane dla każdej tabeli z bazy danych SQLite do CSV, a następnie COPY te dane do tabel PostgreSQL. Na koniec zaktualizuj sekwencje za pomocą setval więc generują odpowiednie wartości.
Tak czy inaczej będziesz potrzebować aby upewnić się, że tworzone są odpowiednie sekwencje. Możesz to zrobić przez SERIAL typy pseudokolumn lub ręcznie SEQUENCE tworzenie i DEFAULT ustawienie, ale musisz to zrobić. W przeciwnym razie nie ma możliwości przypisania wygenerowanego identyfikatora do tabeli w wydajny i bezpieczny dla współbieżności sposób.