Cytat z dokumentacji migracji Django :
Pliki migracji dla każdej aplikacji znajdują się w katalogu „migrations” wewnątrz tej aplikacji i są zaprojektowane tak, aby były zatwierdzane i rozpowszechniane jako część jej kodu źródłowego. Powinieneś zrobić je raz na swojej maszynie deweloperskiej, a następnie uruchomić te same migracje na maszynach swoich kolegów, maszynach pomostowych, a ostatecznie na maszynach produkcyjnych.
Jeśli zastosujesz się do tego procesu, nie powinieneś dostawać żadnych konfliktów scalania w plikach migracji.
Podczas scalania gałęzi kontroli wersji nadal możesz napotkać sytuację, w której masz wiele migracji opartych na tej samej migracji nadrzędnej, np. Jeśli do różnych programistów wprowadzono migrację jednocześnie. Jednym ze sposobów rozwiązania tej sytuacji jest wprowadzenie _merge_migration_. Często można to zrobić automatycznie za pomocą polecenia
./manage.py makemigrations --merge
która wprowadzi nową migrację, która zależy od wszystkich obecnych migracji głowy. Oczywiście działa to tylko wtedy, gdy nie ma konfliktu między migracjami głów, w takim przypadku będziesz musiał rozwiązać problem ręcznie.
Biorąc pod uwagę, że niektórzy tutaj sugerowali, że nie powinieneś przenosić migracji do kontroli wersji, chciałbym rozwinąć powody, dla których powinieneś to zrobić.
Najpierw potrzebny jest zapis migracji zastosowanych w systemach produkcyjnych. Jeśli wdrażasz zmiany w środowisku produkcyjnym i chcesz przeprowadzić migrację bazy danych, potrzebujesz opisu bieżącego stanu. Możesz utworzyć oddzielną kopię zapasową migracji zastosowanych do każdej produkcyjnej bazy danych, ale wydaje się to niepotrzebnie uciążliwe.
Po drugie, migracje często zawierają niestandardowy, odręczny kod. Nie zawsze można je automatycznie wygenerować za pomocą ./manage.py makemigrations
.
Po trzecie, migracje powinny zostać uwzględnione w przeglądzie kodu. Są to znaczące zmiany w systemie produkcyjnym i jest wiele rzeczy, które mogą się z nimi nie udać.
Krótko mówiąc, jeśli zależy Ci na danych produkcyjnych, sprawdź migracje do kontroli wersji.
makemigrations some_app
, wpłynie to nie tylko na modele, które są pod jego kontrolą, ale także na inne powiązane modele. Oznacza to, że pliki migracji (00 * _ *) w innych aplikacjach zostaną zmienione. A to powoduje wiele problemów z konfliktami podczas wypychania lub ściągania z GitHub. Ponieważ obecnie nasz system nie jest gotowy do produkcji, mamy tylko.gitignore
plik migracyjny. Nadal nie wiemy, jak rozwiązać ten problem, gdy system trafi do produkcji. Czy ktoś ma jakieś rozwiązania?