Django中迁移的执行顺序

2024-05-19 17:03:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解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在运行测试时如何销毁现有数据库,是否有特定的顺序或方式?它是否以相反(或其他)的顺序应用迁移


Tags: djangopynonehomereturnmigrationsfunctionpeople
2条回答

我自己也经常想知道这一点,所以感谢你发布这个问题,因为它迫使我仔细阅读Django文档

根据文档,文件中的数字仅供开发人员参考。Django使用每个迁移文件中的dependencies部分来确定何时实际运行迁移。因此,基本上,当您执行migrate命令时,Django将收集项目中的所有迁移文件,并使用每个迁移文件中的依赖项,以适当的顺序执行数据库修改

下面列出了完整的文档,供您阅读: https://docs.djangoproject.com/en/3.0/topics/migrations/#workflow

初始迁移的Initial=True,并首先应用它

Initial migrations are marked with an initial = True class attribute on the migration class. If an initial class attribute isn’t found, a migration will be considered “initial” if it is the first migration in the app (i.e. if it has no dependencies on any other migration in the same app).

所有其他迁移都至少依赖于一个应在迁移之前应用的迁移

如果有另一个应用程序的外键,Django还将在依赖项中包含以下应用程序当前状态迁移

AsDjango documentation regarding migrations

dependencies, a list of migrations this one depends on.

运行测试会重新创建数据库(无需降级数据库,只需删除并重新创建)

相关问题 更多 >