我试图理解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
我想知道的是执行的顺序。为什么是这个订单而不是其他订单
我可以看到0001_initial
是第一个(基于名称)的逻辑。之后,它是否只是按照文件命名中指定的顺序
在dependencies
中列出某个迁移是否会使Django在当前迁移之前预先运行它
或者dependencies
部分只是声明性的,旨在防止数据库的状态不一致
另外,Django在运行测试时如何销毁现有数据库,是否有特定的顺序或方式?它是否以相反(或其他)的顺序应用迁移
我自己也经常想知道这一点,所以感谢你发布这个问题,因为它迫使我仔细阅读Django文档
根据文档,文件中的数字仅供开发人员参考。Django使用每个迁移文件中的dependencies部分来确定何时实际运行迁移。因此,基本上,当您执行migrate命令时,Django将收集项目中的所有迁移文件,并使用每个迁移文件中的依赖项,以适当的顺序执行数据库修改
下面列出了完整的文档,供您阅读: https://docs.djangoproject.com/en/3.0/topics/migrations/#workflow
初始迁移的Initial=True,并首先应用它
所有其他迁移都至少依赖于一个应在迁移之前应用的迁移
如果有另一个应用程序的外键,Django还将在依赖项中包含以下应用程序当前状态迁移
AsDjango documentation regarding migrations
运行测试会重新创建数据库(无需降级数据库,只需删除并重新创建)
相关问题 更多 >
编程相关推荐