Di cư ngược với Django South


217

Ok, vì vậy đây có vẻ là một điều thực sự ngớ ngẩn để hỏi, và tôi chắc chắn rằng tôi đang thiếu một cái gì đó ở đâu đó.

Làm thế nào để bạn thực hiện di chuyển ngược bằng cách sử dụng Nam trên Django?

Vì vậy, tôi đã điều chỉnh các mô hình của mình, tạo một di chuyển với schemamigration, chạy di chuyển migratevà bây giờ tôi nhận ra đó không hoàn toàn là những gì tôi muốn và tôi muốn nó quay trở lại trước đó.

Thiếu chỉnh sửa thủ công các bảng db và xóa các tệp di chuyển, làm thế nào tôi nên quay lại di chuyển? Tôi tìm thấy các tài liệu tham khảo về việc di chuyển ngược bằng Nam thông qua Google, nhưng vẫn chưa tìm thấy một ví dụ mã vững chắc cho nó.

Có ai giúp được không?


câu hỏi hay!!
Marshall X

Câu trả lời:


335

Bạn cần tìm ra số lần di chuyển ngay trước lần di chuyển mà bạn muốn quay lại.

Ứng dụng của bạn nên có một thư mục di chuyển, với các tệp trong đó có tên như

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py

Thông thường, khi bạn chạy ./manage.py migrate your_app, Nam chạy tất cả các lần di chuyển mới, theo thứ tự. (Nó nhìn vào các bảng cơ sở dữ liệu để quyết định cái nào là 'mới').

Tuy nhiên, bạn cũng có thể chỉ định bất kỳ di chuyển nào theo số và Nam sẽ di chuyển cơ sở dữ liệu của bạn, về phía trước hoặc phía sau , để đưa nó đến điểm đó. Vì vậy, với các tệp ví dụ ở trên, nếu bạn đã di chuyển tới 0003 và bạn muốn chạy 0003 ngược lại (hoàn tác nó một cách hiệu quả), bạn sẽ chạy

./manage.py migrate your_app 0002

Nam sẽ xem xét cơ sở dữ liệu, nhận ra rằng nó đã chạy 0003 và xác định rằng nó phải chạy di chuyển ngược cho 0003 để quay lại 0002.


1
Thật không may, khi bạn tạo di chuyển tiếp theo, nó sẽ không bỏ qua những lần di chuyển ở giữa, vì vậy bạn chỉ cần di chuyển qua chúng một lần nữa. Có vẻ như có thể có một cách tốt hơn.
mlissner

44
@mlissner Nếu bạn thực sự muốn, sau khi khôi phục cơ sở dữ liệu, hãy chuyển đến thư mục di chuyển của ứng dụng đã cho (trong ví dụ trên your_app / di chuyển) và xóa di chuyển không mong muốn
Josh Russo

1
Chính xác - Nam không bao giờ bỏ qua di cư; nó hy vọng rằng các tệp từ 0001-nnnn đại diện cho một tập hợp di chuyển nhất quán, cho bất kỳ giá trị nào của nnnn. Nếu đó không phải là trường hợp, thì bạn cần phải tự đặt hàng lại hoặc xóa những người vi phạm.
Ian Clelland

217

Chỉ trong trường hợp ai đó (như tôi) tự hỏi làm thế nào để di chuyển trở lại từ ban đầu (0001) :

django-admin.py migrate some_app zero

đầu ra:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial

"Không" là trạng thái đặc biệt trước khi di chuyển.

Tham khảo: http://south.aeracode.org/docs/commands.html


6
Ai đó đã chạy di chuyển 0001 - thực hiện và đây là cách duy nhất để chạy ngược 0001. Cảm ơn!
jmanning2k

1
Câu trả lời rất quan trọng, tôi tự hỏi tại sao migrate 0000không làm việc. Về di chuyển giả, vâng, bạn có thể cần nó, nếu bạn chỉ cần hoàn tác di chuyển ban đầu (có thể sai), nhưng lịch sử di chuyển nghĩ rằng việc di chuyển này không bao giờ xảy ra.
Tomasz Gandor

3

Thêm một tên di chuyển ở cuối các tham số:

./manage.py migrate app-name 00xx-migration-name

2
Không sao, và tôi đã làm điều đó trước đây, nhưng nó rất nhiều cách gõ / dán. Số "trạng thái" trần - trong trường hợp này 00xx- là đủ. Khi cải thiện và kiểm tra di chuyển, bạn có thể có cả hai lệnh trong lịch sử: chuyển tiếp (không có đối số), lùi lại với số trạng thái trước đó.
Tomasz Gandor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.