2016-10-13 27 views
10

Trong mã di chuyển của Django, có một lệnh squashmigrations: "Ép di chuyển cho app_label tối đa và bao gồm migration_name xuống ít di chuyển hơn, nếu có thể."Làm thế nào để squash di cư Django gần đây?

Vì vậy, nếu bạn muốn bíp, ví dụ, 5 lần di chuyển đầu tiên, điều này sẽ hữu ích.

Cách tốt nhất để chơi bóng quần bắt đầu bằng một số migration_name cụ thể là gì?

Trong dự án tôi hiện đang làm việc, chúng tôi đã thêm 5-10 tệp di chuyển mới khi chúng tôi đã thêm các tính năng mới. Chúng tôi sẽ triển khai toàn bộ dự án cùng một lúc và có vẻ như việc chạy các dự án này sẽ mất quá nhiều thời gian. Tôi muốn bíp tất cả các di chuyển cho dự án này thành một lần di trú và kiểm tra thời gian để chạy nó.

+0

Cập nhật về điều này - sau khi bẻ khóa và thử nghiệm, quá lâu. Một phần lớn của điều này là bởi vì đối với mỗi cột tôi đã thêm, MySQL sẽ sao chép toàn bộ bảng, thêm cột, và sau đó đổi tên bảng. Tôi đã sử dụng 'sqlmigrate' để xem SQL sẽ chạy và kết hợp bốn câu lệnh ALTER TABLE riêng biệt thành một với bốn phần ADD COLUMN và chạy nó bằng cách sử dụng' migrations.RunSQL' với đối số 'state_operations' để giữ trạng thái di chuyển của trạng thái hạnh phúc. –

Trả lời

18
python manage.py squashmigrations <appname> <squashfrom> <squashto> 

python manage.py help squashmigrations 

https://docs.djangoproject.com/en/dev/topics/migrations/#migration-squashing

Điều này sẽ cung cấp cho bạn quyền kiểm soát chi tiết hơn về việc di chuyển để bí mật và cho phép bạn giữ lịch sử cam kết rõ ràng hơn. Việc xóa + tạo lại tất cả các lần di chuyển có thể gây ra các vấn đề khác như phụ thuộc vòng tròn tùy thuộc vào cách các mô hình được tạo.

+2

Câu trả lời hay - _if_ chạy Django 1.9 trở lên. Đáng buồn thay, dự án này là trên 1.8 –

+2

Điều này được câu trả lời chấp nhận bởi vì nó sử dụng chức năng bản địa cho các phiên bản hiện đại của Django. Những vẫn còn trên các phiên bản của Django trước 1.9 nên xem câu trả lời của Dan. –

6

Bạn chỉ có thể xóa các tệp di chuyển và chạy lại makemigrations. Nếu bạn có một triển khai nhà phát triển sử dụng những điều này, bạn nên migrate back vào một triển khai trước lần đầu tiên bạn xóa.

Ngoài ra, có thể bạn nên cam kết mã của mình trước tiên, trong trường hợp có sự cố.

Ngoài ra:

Các biến chứng nhẹ với điều này là nếu có tùy chỉnh RunPython mã, nó sẽ không được bao gồm trong sự di cư mới được tạo ra bởi makemigrations

+0

Rất hợp lý và rõ ràng. Tôi sẽ làm điều đó trong một nhánh :-) –

+2

Biến chứng nhỏ với điều này là nếu có mã tùy chỉnh 'RunPython', nó sẽ không được bao gồm trong quá trình di chuyển mới được tạo bởi' makemigrations' –

+0

Nếu bạn xóa di chuyển đã chọn (nói tất cả các di chuyển sau '__init__'), sau đó chạy' makemigrations' và thấy một thông báo như 'Bạn có 1 (các) di chuyển chưa được áp dụng', bạn có thể chạy './manage.py migrate --fake' thành 'fake' the di chuyển (mặc dù các thành viên khác trong nhóm sẽ nhận được toàn bộ quá trình di chuyển). – inostia

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