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.