我应该将django迁移文件保存在git存储库中吗?在开发人员团队中,他们如何管理数据库更改。
例如,Tom已经对他们的模型进行了更改,并运行了makemigrations并进行了迁移,他的数据库现在已经更改,以及他的迁移文件,保留了他的迁移故事。
与此同时,鲍勃也做出了改变。他的移植文件与其他模型有关,他运行makemigrations并迁移命令,并且他的数据库发生了变化。
Tom和Bob正在使用相同的应用,因此,他们共享相同的迁移文件。同样的数据库也是如此。
那么,当Bob将他们的代码推送到git repo,然后Tom从git repo中提取或获取它时会发生什么?迁移文件将混合在一起,故事将被破坏。另外,对于db本身,如果它是一个sqlite文件,我应该把它保存在git repo中吗?
答案 0 :(得分:5)
你绝对应该在你的回购中保留迁移!对于某些项目,通过编辑它们来在迁移中包含初始数据或其他功能是有意义的,因此通过从models.py
自动生成它们来设置每个开发人员的环境不会为每个项目工作
如果Tom和Bob都进行了彼此独立的更改(Tom添加了一个字段,Bob添加了另一个字段),则迁移文件将在您创建合并迁移时起作用。如果他们发生冲突,汤姆和鲍勃可能需要协调:
$ python manage.py migrate
CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0002_mymodel_my_field_tom, 0002_mymodel_my_field_bob in myapp).
To fix them run 'python manage.py makemigrations --merge'
$ python manage.py makemigrations --merge
Merging myapp
Branch 0002_mymodel_my_field_bob
- Add field my_field_bob to mymodel
Branch 0002_mymodel_my_field_tom
- Add field my_field_tom to mymodel
Merging will only work if the operations printed above do not conflict
with each other (working on different fields or models)
Do you want to merge these migration branches? [y/N] y
Created new merge migration /myapp/migrations/0003_merge_20170517_1445.py
这里读得很好:
https://www.algotech.solutions/blog/python/django-migrations-and-how-to-manage-conflicts/
答案 1 :(得分:1)
您应该将迁移文件保存在git中,以确保所有开发人员的数据库架构保持同步。稍后,这些相同的迁移文件用于迁移生产数据库。
任何开发人员都可以创建迁移文件并添加到版本控制并推送到远程服务器。 Django的migrate
命令检测到新的迁移并将它们应用于数据库。
如果两个开发人员正在使用同一个应用程序,并且他们都创建了迁移,那么django将创建一个合并迁移文件,就像git创建一个合并提交一样。此合并迁移将确保数据库架构中没有冲突,并且它们的数据库与最新的提交同步。
答案 2 :(得分:1)
https://gist.github.com/mhipo1364/a55da230e1ec80bfab70e9650637bb15/revisions
要将现有的迁移文件合并为一个文件,
django_migration
个记录表python manage.py migrate --fake
命令python manage.py makemigrations
命令python manage.py migrate --fake-initial
命令python manage.py migrate contenttypes
命令python manage.py migrate
命令答案 3 :(得分:0)
如果对不同型号进行更改,最好的处理方法是
makemigrations with -merge flag