2011-08-17 14 views
6

Moja strategia wdrażania wygląda następująco (przy użyciu tkaniny):programowo sprawdzić, czy istnieją Django migracji na południe, które muszą być wdrożone

  1. utworzyć nowy virtualenv
  2. wdrożyć nowy kod w nowym virtualenv
  3. pokaż strona konserwacja
  4. skopiować bieżący db do nowego db
  5. migrować nowy dB
  6. punkt nowy kod do nowego db
  7. symlink prąd virtualenv do nowego venv
  8. usługi restart
  9. konserwacja usuń strona

Chcę szybko iteracji. Obecnie większość zmian w kodzie nie zawiera migracji. Ponadto baza danych rośnie, więc wiele kosztów generuje się, kopiując bazę danych za każdym razem, gdy wdrażam (głównie małą) zmianę. Aby uniknąć kopiowania bazy danych, chcę sprawdzić, czy istnieją migracje, które należy wdrożyć (przed krokiem 4). Jeśli nie ma migracji, mogę przejść od kroku 2 do kroku 7. Jeśli tak, to wykonam wszystkie kroki. W tym celu muszę programowo sprawdzić, czy istnieją migracje, które należy wdrożyć. Jak mogę to zrobić?

Odpowiedz

5

W kroku 2 podczas wdrażania nowego kodu można wdrożyć skrypt, który po uruchomieniu na serwerze wykryje, czy są nowe migracje.

Przykładowy kod wygląda następująco:

# 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 

Jeśli owinąć powyższy kod w górę w skrypcie, skrypt wdrożenie tkaniny można użyć operacji run, aby uzyskać liczbę nowych migracji.

Jeśli to zwróci zero, możesz pominąć kroki związane z kopiowaniem bazy danych.    

+1

Dzięki, Philip, za pokazanie kodu. To jest prawie dokładnie to, jak go zaimplementowałem. Działa świetnie, wykonano już wiele wdrożeń zi bez migracji przy użyciu tej metody. –

1

Dlaczego przenosisz bazy danych? Cały punkt migracji polega na zastosowaniu zmian wprowadzonych w rozwoju do bazy danych produkcji.

swoje kroki powinny być naprawdę:

  1. utworzyć nowy virtualenv
  2. wdrożyć nowy kod w nowym virtualenv
  3. wykazują stronie Konserwacja
  4. migrować nowy DB
  5. symlink aktualny virtualenv do nowych venv
  6. restart usługi
  7. usuń strona konserwacji

Krok migracji nie potrwa zbyt długo, jeśli nie ma żadnych nowych migracji do uruchomienia. Po prostu przejdzie przez każdą aplikację, mówiąc, że jest już aktualna.

Jeśli kopiujesz bazę danych w celu utworzenia kopii zapasowej, jest to coś, co powinno działać niezależnie od crona lub czegoś w tym rodzaju, a nie jako część wdrożenia.

Właściwie to jestem zdezorientowany przy tworzeniu nowego virtualenv za każdym razem. Znormalizowany (czytaj: najbardziej typowe) wdrożenie jest:

  1. wdrożyć nowy kod
  2. Migrate db
  3. usługi restart

Jeśli chcesz dodać z powrotem do rzeczy widoku konserwacji, można , ale proces zajmuje tylko minutę lub dwie sumy.

+0

Celem mojej strategii jest umożliwienie szybkiego wycofania. Wycofanie się z moją strategią jest tylko kwestią dowiązania do poprzedniego virtualenv, które wciąż wskazuje na właściwą db. Z twoją sugestią, jeśli coś pójdzie nie tak, utkniesz z migrowaną bazą danych i virtualenv, który jest trudny do wycofania. Aby przywrócić bazę danych, potrzebujesz bazy danych z kopiami zapasowymi, która prawdopodobnie nie będzie aktualna. Nie zaleca się również wycofywania z południa. Chcę trzymać się mojej strategii, ale bez kopiowania i migrowania bazy danych, jeśli nie ma migracji. Moje pytanie nadal jest aktualne. –

+0

Dlaczego nie zaleca się cofania z południem? Jeśli prawidłowo skonfigurujesz swoje migracje na Południu, tak że dane nigdy nie zostaną usunięte, a tylko przeniesione, wówczas zupełnie koszerne będzie wycofywanie migracji. To dosłownie jest celem migracji. –

+0

Myślałem, że autor South (Andrew Godwin) powiedział, że sam (Djangocon UE 2011). Mogłem jednak źle to zinterpretować. Jeśli nie ma prawdziwych problemów z prawidłową konfiguracją migracji wstecz, prawdopodobnie powinienem pójść w ten sposób. –

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

Will powiedzieć i pokazać, które migracje. Jeśli potrzebujesz kodu powrotu lub liczby, użyj wc.

Ma to zalety polegające na tym, że nie można kopiować i wklejać kodu, takiego jak zaakceptowana odpowiedź (naruszając DRY), a także, jeśli wewnętrzny południowy interfejs API zmieni twój kod, nadal będzie działał.

UPDATE:

Django 1.7 zmienił wyjście do korzystania wspornik zamiast nawiasu i Django 1.8 wprowadzono showmigration polecenie:

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

proste i proste, lubię to. – caesarsol

+0

Po prostu w 100% jasne - czy to będzie dotyczyło wszelkich nieaplikowanych migracji? A może po prostu wymieni niewykorzystane migracje? –

+0

Będzie tylko lista i nic nie dotyczy. Idealnie bezpieczny. – dalore

1

odpowiedź dalore updated dla Django 1.7+

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

Jeśli chcesz tylko liczbę:

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