2012-12-07 50 views
6

Tôi đang cố gắng thêm cột 'id' khóa chính vào một bảng MySQL đã có bằng alembic. Tôi đã thử các sau đây ...Thêm khóa chính vào bảng MySQL hiện có trong alembic

op.add_column('mytable', sa.Column('id', sa.Integer(), nullable=False)) 
op.alter_column('mytable', 'id', autoincrement=True, existing_type=sa.Integer(), existing_server_default=False, existing_nullable=False) 

nhưng đã nhận lỗi sau

sqlalchemy.exc.OperationalError: (OperationalError) (1075, 'Incorrect table definition; there can be only one auto column and it must be defined as a key') 'ALTER TABLE mytable CHANGE id id INTEGER NOT NULL AUTO_INCREMENT'() 

trông giống như câu lệnh SQL được tạo ra bởi nồi cất rượu không thêm PRIMARY KEY ở phần cuối của báo cáo kết quả alter. Tôi có thể đã bỏ lỡ một số cài đặt không?

Cảm ơn trước!

Trả lời

16

Tôi đã dành thời gian đào bới mã nguồn alembic và điều này dường như không được hỗ trợ. Bạn có thể chỉ định các khóa chính khi tạo một bảng chứ không phải khi thêm cột. Trong thực tế, nó đặc biệt kiểm tra và sẽ không cho phép bạn:

# from alembic.operations.add_column, line 284 
for constraint in t.constraints: 
    if not isinstance(constraint, schema.PrimaryKeyConstraint): 
    self.impl.add_constraint(constraint) 

Tôi nhìn xung quanh, và thêm một khóa chính cho một bảng hiện có thể dẫn đến hành vi không xác định - khóa chính không phải là null, vì vậy động cơ của bạn có thể hoặc không thể tạo khóa chính cho các hàng hiện có. Xem thảo luận SO này để biết thêm thông tin: Insert auto increment primary key to existing table

Tôi chỉ cần chạy truy vấn thay đổi trực tiếp và tạo khóa chính nếu bạn cần.

op.execute("ALTER TABLE mytable ADD id INT PRIMARY KEY AUTO_INCREMENT;") 

Nếu bạn thực sự cần khả năng tương thích chéo, búa lớn sẽ là (1) tạo bảng mới giống với cái cũ bằng khóa chính, (2) di chuyển tất cả dữ liệu của bạn, (3) xóa bảng cũ và (4) đổi tên bảng mới.

Hy vọng điều đó sẽ hữu ích.

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