2011-08-17 26 views
6

chiến lược triển khai của tôi trông như thế này (sử dụng vải):lập trình kiểm tra xem có những cuộc di cư về phía nam django mà cần phải được triển khai

  1. tạo virtualenv mới
  2. triển khai mã mới trong virtualenv mới
  3. chương trình một trang duy trì
  4. sao chép db hiện tại để db
  5. mới di chuyển db mới
  6. điểm mã mới để db mới
  7. liên kết tượng trưng virtualenv hiện tại để venv mới
  8. dịch vụ khởi động lại
  9. trang bảo trì remove

Tôi muốn lặp nhanh. Bây giờ, hầu hết các thay đổi mã không chứa di chuyển. Ngoài ra, db đang phát triển, vì vậy có nhiều chi phí được tạo ra bằng cách sao chép cơ sở dữ liệu mỗi khi tôi triển khai một sự thay đổi (chủ yếu là nhỏ). Để tránh việc sao chép cơ sở dữ liệu tôi muốn kiểm tra xem có cần phải triển khai các di chuyển nào (trước bước 4) hay không. Nếu không có di chuyển, tôi có thể đi thẳng từ bước 2 đến bước 7. Nếu có, tôi sẽ làm theo tất cả các bước. Đối với điều này, tôi cần phải kiểm tra theo chương trình cho dù có di chuyển cần phải được triển khai. Tôi có thể làm cái này như thế nào?

Trả lời

5

Ở bước 2 trong khi triển khai mã mới, bạn có thể triển khai tập lệnh khi chạy trên máy chủ sẽ phát hiện nếu có di chuyển mới.

Ví dụ mã như sau:

# copied mostly from south.management.commands.migrate 
from south import migration 
from south.models import MigrationHistory 

apps = list(migration.all_migrations()) 

applied_migrations = MigrationHistory.objects.filter(app_name__in=[app.app_label() for app in apps]) 
applied_migrations = ['%s.%s' % (mi.app_name,mi.migration) for mi in applied_migrations] 

num_new_migrations = 0 
for app in apps: 
    for migration in app: 
     if migration.app_label() + "." + migration.name() not in applied_migrations: 
      num_new_migrations = num_new_migrations + 1 

return num_new_migrations 

Nếu bạn quấn mã lên trên trong một kịch bản, triển khai kịch bản vải của bạn có thể sử dụng các hoạt động chạy để có được số di cư mới.

Nếu điều này trả về 0, thì bạn có thể bỏ qua các bước liên quan đến việc sao chép cơ sở dữ liệu.    

+1

Cảm ơn, Philip, đã hiển thị mã. Đây gần như chính xác là cách tôi đã triển khai nó. Hoạt động tốt, đã thực hiện rất nhiều triển khai có và không có di chuyển bằng phương pháp này. –

1

Tại sao bạn di chuyển cơ sở dữ liệu xung quanh? Toàn bộ điểm di chuyển là áp dụng các thay đổi bạn đã thực hiện trong quá trình phát triển cho cơ sở dữ liệu sản xuất của bạn.

bước bạn thực sự cần là:

  1. tạo virtualenv mới
  2. triển khai mã mới trong virtualenv mới
  3. hiển thị một trang duy trì
  4. di chuyển db mới
  5. liên kết tượng trưng hiện tại virtualenv để mới venv
  6. dịch vụ khởi động lại
  7. xóa trang bảo trì

Và bước di chuyển không mất nhiều thời gian nếu không có di chuyển mới thực sự chạy. Nó sẽ chỉ chạy qua mỗi ứng dụng nói rằng nó đã được cập nhật.

Nếu bạn sao chép cơ sở dữ liệu để có bản sao lưu, đó là thứ cần chạy anyways trên cron hoặc một cái gì đó, không phải là một phần của triển khai của bạn.

Thực ra, tôi cũng bối rối khi tạo ảo mới mỗi lần. Các chuẩn hóa (đọc: điển hình nhất) triển khai là:

  1. triển khai mã mới
  2. Di chuyển db
  3. dịch vụ khởi động lại

Nếu bạn muốn thêm trở lại trong những thứ trang bảo trì, bạn có thể nhưng quá trình này chỉ mất một hoặc hai phút.

+0

Mục đích của chiến lược của tôi là có thể quay lại nhanh. Quay trở lại với chiến lược của tôi chỉ là vấn đề liên kết với virtualenv trước đó mà vẫn trỏ đến db bên phải. Với đề xuất của bạn, nếu có vấn đề gì đó, bạn bị kẹt với một cơ sở dữ liệu đã di chuyển và một virtualenv khó quay trở lại. Để quay trở lại db, bạn cần một cơ sở dữ liệu sao lưu mà không có khả năng được cập nhật. Ngoài ra, quay trở lại với Nam không được khuyến khích. Tôi muốn dính vào chiến lược của mình, nhưng không sao chép và di chuyển cơ sở dữ liệu, nếu không có di chuyển. Vì vậy, câu hỏi của tôi vẫn đứng vững. –

+0

Tại sao quay lại với Nam không được khuyến nghị? Nếu bạn thiết lập di chuyển miền Nam của bạn đúng cách, chẳng hạn dữ liệu đó sẽ không bao giờ bị xóa, chỉ di chuyển xung quanh, sau đó hoàn toàn kosher để khôi phục di chuyển. Nghĩa đen là toàn bộ mục đích di cư. –

+0

Tôi nghĩ tác giả của miền Nam (Andrew Godwin) nói rằng bản thân ông (Djangocon EU 2011). Tôi có thể đã hiểu sai nó mặc dù. Nếu không có vấn đề thực sự với việc thiết lập đúng cách di chuyển ngược, tôi có lẽ sẽ đi theo cách đó. –

3
./manage.py migrate --all --merge --list | grep "()" 

Will tell và cho bạn thấy những cuộc di cư. Nếu bạn muốn một mã trả về hoặc đếm, hãy sử dụng wc.

Điều này có lợi thế là không sao chép và dán mã như câu trả lời được chấp nhận (vi phạm DRY) và cũng nếu api phía nam bên trong thay đổi mã của bạn sẽ vẫn hoạt động.

UPDATE:

Django 1,7 thay đổi sản lượng để sử dụng khung thay vì ngoặc và Django 1.8 giới thiệu một lệnh showmigration:

./manage.py showmigrations --list | grep '[ ]' 
+1

đơn giản và dễ hiểu, tôi thích điều này. – caesarsol

+0

Chỉ cần rõ ràng 100% - điều này có áp dụng bất kỳ di chuyển chưa được áp dụng nào không? Hoặc nó sẽ chỉ đơn giản là danh sách di chuyển chưa được áp dụng? –

+0

Nó sẽ chỉ liệt kê và không áp dụng bất cứ điều gì. An toàn tuyệt đối. – dalore

1

câu trả lời dalore của cập nhật cho Django 1.7+

./manage.py migrate --list | grep "\[ ]" 

Nếu bạn chỉ muốn đếm sau đó:

./manage.py migrate --list | grep "\[ ]" | wc -l 
Các vấn đề liên quan