将迁移添加到源代码管理并合并 Django 中的冲突迁移

Posted

技术标签:

【中文标题】将迁移添加到源代码管理并合并 Django 中的冲突迁移【英文标题】:Adding Migrations to Source Control and Merging Conflicting Migrations in Django 【发布时间】:2021-02-20 17:13:53 【问题描述】:

我接手了一个 Django 项目,发现 Git 没有跟踪各种应用程序的迁移。这似乎有点问题,因为我的理解是应该始终跟踪迁移。这几乎是共识还是有理由不这样做?

问题的第二部分与我做了一些涉及在本地调整一些迁移的工作有关。我现在想将更改推送到生产环境。但是,我不确定合并可能的冲突的最佳方法是什么。

例如,在生产中,我有以下内容:

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    mysite/aldryn_forms/migrations/0019_auto_20200730_1455.py
    mysite/apps/common/migrations/0016_auto_20200624_2028.py
    mysite/apps/common/migrations/0016_auto_20200625_1125.py
    mysite/apps/common/migrations/0017_merge_20200625_1129.py
    mysite/apps/common/migrations/0018_auto_20200720_1743.py
    mysite/apps/payment/migrations/0005_auto_20200624_2028.py
    mysite/apps/payment/migrations/0005_auto_20200625_1125.py
    mysite/apps/payment/migrations/0006_merge_20200625_1129.py
    mysite/apps/payment/migrations/0007_auto_20200720_1743.py
    mysite/apps/payment/migrations/0008_paymentmodel_course.py
    mysite/apps/payment/migrations/0009_paymentmodel_user.py
    mysite/apps/plugins/migrations/0016_auto_20200624_2028.py
    mysite/apps/plugins/migrations/0016_auto_20200625_1125.py
    mysite/apps/plugins/migrations/0017_merge_20200625_1129.py
    mysite/apps/xyz/migrations/0005_auto_20200730_1455.py

在本地,我有以下内容:

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    mysite/aldryn_forms/migrations/0019_auto_20201108_1623.py
    mysite/apps/common/migrations/0016_auto_20201108_1623.py
    mysite/apps/common/migrations/0017_auto_20201108_1806.py
    mysite/apps/payment/migrations/0005_auto_20201108_1623.py
    mysite/apps/plugins/migrations/0016_auto_20201108_1623.py
    mysite/apps/xyz/migrations/0005_auto_20201108_1623.py

这些是自定义工作的文件:

mysite/apps/common/migrations/0016_auto_20201108_1623.py
mysite/apps/common/migrations/0017_auto_20201108_1806.py

似乎生产服务器上存在的所有迁移都已应用于生产数据库。因此,我得出结论,它们正确地描述了生产数据库的状态。

我应该怎么做才能将我的本地作品与当前正在生产的作品同步?

【问题讨论】:

【参考方案1】:

首先,我将检查您的新迁移和生产中应用的迁移中的冲突代码。

然后备份所有内容(您的站点和生产)。

如果您没有发现逻辑错误,请尝试将迁移文件从生产环境复制到您的站点并使用:

python manage.py makemigrations –merge
python manage.py migrate

如果它有效,那么它将在生产中正常工作。 有关于它的文章: https://www.algotech.solutions/blog/python/django-migrations-and-how-to-manage-conflicts/#:~:text=So%2C%20in%20order%20to%20allow,manage.py%20makemigrations%20%E2%80%93merge)

一旦我也拥有它......令人讨厌的是你将不得不这样做 - 合并每个新的迁移。 在某些时候,我会重置迁移。

什么时候你会整理好数据库。你可以这样做:

备份数据库并从数据库表中删除插入:迁移 从项目目录中删除所有迁移文件 qoute urls.py 中的所有模式 进行 makemigrations 并迁移 用旧数据填充新数据库(迁移表除外)

哦,使用 --fake 有更简单的方法: https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html

这将使您进行初始迁移。

【讨论】:

以上是关于将迁移添加到源代码管理并合并 Django 中的冲突迁移的主要内容,如果未能解决你的问题,请参考以下文章

Django:合并迁移冲突的最佳方法

应该将 Django 项目中的迁移目录推送到 git repo 吗?

我应该在 .gitignore 文件中添加 Django 迁移文件吗?

Django 数据库迁移:将两个字段合并为一个

如何将自定义用户模型迁移到 Django 中的不同应用程序?

从零开始的Devops-临时快速实现