2012-01-23 24 views
6

Cách tạo bảng bằng cách sử dụng lớp khai báo ORM không có khóa chính? Không thể khởi động nếu tôi không tạo bất kỳ cột nào là primary_key = True.Tuyên bố SQLAlchemy: bảng không có bất kỳ khóa chính nào?

+0

tôi có thể hỏi, tại sao bạn muốn làm một điều như vậy? –

+0

@JonathanOng Bởi vì tôi muốn thêm một số chỉ mục sau này, và có vẻ như mysql có thể làm một cái gì đó như thế này. – Determinant

Trả lời

11

SQLAlchemy lõi không phàn nàn về thiếu khóa chính, vì vậy có thể tạo bảng như vậy với Table(…). Nhưng ORM theo thiết kế yêu cầu một cách để xác định hàng tương ứng với đối tượng, do đó không thể sử dụng bảng không có khóa chính trong ORM.

Tại sao bạn cần thêm chỉ mục này sau? Đó có phải là yêu cầu thực sự hoặc một nỗ lực để giải quyết một số vấn đề mà có lẽ có thể được giải quyết theo cách khác? Trong trường hợp bạn cần khóa chính kết hợp, có thể xác định nó bằng đối số primary_key=True trong một số Column s hoặc bằng cách chỉ định PrimaryKeyConstraint(…) trong __table_args__.

+0

Tôi dự định tạo chỉ mục nhiều cột. Và nó sẽ là tuyệt vời nếu tôi có thể tuyên bố rõ ràng rằng chỉ mục phải được xây dựng bằng cách sử dụng BTREE (cơ sở dữ liệu của tôi là MySQL). Bất kỳ giải pháp? – Determinant

+1

Hầu hết các cơ sở dữ liệu (kể cả MySQL) đều sử dụng B-Tree theo mặc định, vì vậy chỉ cần chỉ định 'primary_key = True' trong tất cả' Column's tham gia vào chỉ mục tổng hợp. Rõ ràng đặc tả B-Tree (hoặc loại khác) được hỗ trợ trong 'Index (…)' ví dụ cho PostgreSQL, nhưng không phải cho MySQL và không phải trong 'PrimaryKeyConstraint'. Hình như thiếu tính năng trong SQLAlchemy. –

+6

bạn cũng có thể đặt danh sách các cột là "chính" trong đối số "primary_key" để ánh xạ(), với khai báo '__mapper_args__ = {" primary_key ": (col1, col2)}}' – zzzeek

Các vấn đề liên quan