PRIMARY KEY
của bạn nên được xác định để sử dụng SEQUENCE
dưới dạng DEFAULT
, qua SERIAL
kiểu giả tiện lợi:
CREATE TABLE blah (
id serial primary key,
...
);
hoặc SEQUENCE
rõ ràng :
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;
Đây là được thảo luận trong tài liệu SQLAlchemy .
Bạn có thể thêm cái này vào bảng hiện có:
CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
nếu bạn muốn khôi phục kết xuất thì hãy thêm các trình tự theo cách thủ công.
Nếu có dữ liệu hiện có, bạn đã tải trực tiếp vào các bảng bằng COPY
hoặc tương tự, bạn cần đặt điểm bắt đầu trình tự:
SELECT setval('blah_id_seq', max(id)+1) FROM blah;
Tôi muốn nói rằng vấn đề có thể xảy ra với việc bạn đang phát triển trong SQLite, sau đó thực hiện kết xuất và khôi phục kết xuất đó vào PostgreSQL. SQLAlchemy dự kiến sẽ tự tạo lược đồ với các giá trị mặc định và trình tự thích hợp.
Thay vào đó, những gì tôi khuyên bạn nên làm là sử dụng SQLAlchemy để tạo một cơ sở dữ liệu trống mới. Kết xuất dữ liệu cho từng bảng từ SQLite DB sang CSV, sau đó COPY
dữ liệu đó vào các bảng PostgreSQL. Cuối cùng, cập nhật các trình tự bằng setval
để chúng tạo ra các giá trị thích hợp.
Bằng cách này hay cách khác, bạn sẽ cần để đảm bảo rằng các trình tự thích hợp được tạo ra. Bạn có thể làm điều đó bằng SERIAL
kiểu cột giả hoặc bằng SEQUENCE
thủ công tạo và DEFAULT
thiết lập, nhưng bạn phải làm điều đó. Nếu không, không có cách nào để gán một ID đã tạo cho bảng một cách hiệu quả, đồng thời và an toàn.