Я пытаюсь понять, как Django подходит к миграции, когда применяет их к базе данных.
В частности, предположим, что я смотрю на это приложение:
https://github.com/divio/aldryn-people/tree/master/aldryn_people/migrations
Я вставил точку останова в каждый файл миграции, как показано ниже:
def break_function(apps, schema_editor):
print("Entered break_function() 0007")
breakpoint()
...
migrations.RunPython(break_function),
При выполнении тестов я получаю следующее (Django пытается создать бренд новая база данных для тестирования и применяет все миграции для этого)
Creating test database for alias 'extra'...
Entered break_function() 0001
--Return--
> /home/user/sites/aldryn-people/aldryn_people/migrations/0001_initial.py(14)break_function()->No
ne
-> breakpoint()
(Pdb) c
Entered break_function() 0002
--Return--
> /home/user/sites/aldryn-people/aldryn_people/migrations/0002_auto_20150128_1411.py(8)break_func
tion()->None
-> breakpoint()
(Pdb) c
Entered break_function() 0003
--Return--
> /home/user/sites/aldryn-people/aldryn_people/migrations/0003_auto_20150425_2103.py(9)break_func
tion()->None
-> breakpoint()
(Pdb) c
Entered break_function() 0004
--Return--
> /home/user/sites/aldryn-people/aldryn_people/migrations/0004_auto_20150622_1606.py(8)break_func
tion()->None
-> breakpoint()
(Pdb) c
Entered break_function() 0005
--Return--
> /home/user/sites/aldryn-people/aldryn_people/migrations/0005_auto_20150723_1508.py(10)break_fun
ction()->None
-> breakpoint()
(Pdb) c
Entered break_function() 0006
--Return--
> /home/user/sites/aldryn-people/aldryn_people/migrations/0006_person_groups.py(9)break_function(
)->None
-> breakpoint()
(Pdb) c
Entered break_function() 0007
--Return--
> /home/user/sites/aldryn-people/aldryn_people/migrations/0007_copy_group.py(8)break_function()->
None
-> breakpoint()
(Pdb) c
Что меня интересует, так это порядок выполнения. Почему этот заказ, а не какой-то другой?
Я вижу логи c из 0001_initial
, которые являются первыми (в зависимости от названия). После этого это просто в порядке, указанном в именовании файлов?
Может ли перечисление определенной миграции в dependencies
заставить Django предварительно выполнить ее перед текущей?
Или раздел dependencies
является просто декларативным и направлен на предотвращение несовместимых состояний БД?
Кроме того, существует ли определенный порядок c или способ, которым Django уничтожает существующий база данных, когда он запускает тесты? Применяется ли миграция в обратном (или каком-либо другом) порядке?