2010-11-07 21 views
18

tôi đã chạy vào cùng một vấn đề được trình bày bởi các commenter ở đây: Django South - table already existsKhông Lỗi cột như vậy trong Django App Sau Nam Migration

Không có theo dõi, vì vậy tôi nghĩ rằng tôi muốn gửi một câu hỏi mới. Tôi có một ứng dụng Django có di chuyển tôi quản lý với miền Nam. Tôi đã thêm một trường vào mô hình của mình rồi chạy

./manage schemamigration my_app --auto 

chạy như mong đợi. Tuy nhiên, chạy

./manage migrate my_app 

tuy nhiên, dẫn đến lỗi cho biết bảng được liên kết với mô hình tôi thay đổi đã tồn tại. Điều này dẫn tôi đến câu hỏi được liên kết ở trên, do đó, chạy

./manage migrate my_app --fake 

giải quyết lỗi bảng, nhưng hiện tại tôi gặp lỗi Django rằng cột được liên kết với trường mới không tồn tại.

./manage sqlall my_app 

hiển thị giản đồ như mong đợi.

Bất kỳ suy nghĩ nào về cách khắc phục điều này đều được đánh giá cao!

Trả lời

32

Cách dễ nhất là bạn sẽ bắt đầu di chuyển từ đầu.

Xóa tất cả migrations/* tệp cho ứng dụng mà bạn cố sửa. Khôi phục models.py của bạn về trạng thái hiện tại trên cơ sở dữ liệu (bằng sự trợ giúp của các công cụ kiểm soát phiên bản hoặc chỉ nhận xét các trường mới). Sau đó, khởi tạo di chuyển:

manage.py migrate my_app --delete-ghost-migrations 
manage.py schemamigration my_app --init 
manage.py migrate my_app --fake 

Điều này sẽ tạo bản ghi về di chuyển cấu trúc cơ sở dữ liệu hiện tại.

Bây giờ thêm những thay đổi của bạn để models.py và nam sẽ bây giờ những gì đã thay đổi:

manage.py schemamigration my_app --auto 
manage.py migrate my_app 
+0

Đảm bảo xóa tất cả các mục nhập cơ sở dữ liệu về di chuyển lược đồ phía nam đã thực hiện trước đó (nếu bạn đã sửa đổi). @drew: sai lầm chính của bạn là bạn nên đã thực hiện việc di chuyển initali và chạy '.manage di chuyển my_app --fake' TRƯỚC KHI thêm trường mới vào mô hình! –

+1

@lazerscience 'manage.py di chuyển my_app --delete-ghost-migrations' thực hiện điều này. – Ski

+0

Xin lỗi. Tôi bỏ qua bằng cách nào đó ... –

5

Cái gì khác để giữ một mắt ra cho: bạn sẽ thường xuyên nhận được lỗi này (DatabaseError: no such column: appname_model.fieldname) nếu bạn đang sử dụng một giá trị default trong mối quan hệ ForeignKey và bạn thêm trường vào mô hình FK đó.

Giống như (trong models.py của bạn):

class MyAppModel(models.Model): 
    my_foreign_key = models.ForeignKey(FkModel, 
             default=lambda: FkModel.objects.get(id=1), 
             null=True) 

Sau đó, trong một di dân mới, bạn thêm một lĩnh vực mới để FkModel của bạn:

class FkModel(models.Model): 
    new_field = models.IntegerField('New Field Name', blank=True, null=True) 

Bạn sẽ nhận được một lỗi khi chạy một Nam schemamigration:

DatabaseError: no such column: myappmodel_fkmodel.new_field

Bạn có thể giải quyết điều này bằng cách đảm bảo di chuyển Nam ban đầu của bạn bao gồm hàm giá trị mặc định lambda, nhưng sau đó loại bỏ giá trị mặc định trong lần di chuyển tiếp theo.

Điều này đã cắn tôi trong quá khứ. Hy vọng nó sẽ giúp ai đó trong tương lai.

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