2

尝试将我的合并发送到我在循环 CI 上的自动化测试时,我遇到了一个相当烦人的问题。

就上下文而言,我继承了一个项目,作者不再从事我目前的工作。

我正在使用 django 并且已经完成了从本地 dev 分支到本地 master 分支的合并。合并进行得很顺利。但是,当通过 a 启动 django 服务器时manage.py runserver,它给了我警告Your project may not work properly until you apply the migrations for app(s)[...]

做的时候manage.py migrate,我遇到了第一个问题:

1-django.db.utils.ProgrammingError: relation "cms_disclaimerpanel" already exists

我通过手动编辑迁移文件来解决此问题,注释以下行

 #       migrations.CreateModel(
 #           name='DisclaimerPanel',
 #           fields=[
 #               ('abstractpanel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.AbstractPanel')),
 #               ('title', models.CharField(blank=True, max_length=1024, verbose_name='title')),
 #               ('show_title', models.BooleanField(default=True, verbose_name='show title')),
 #               ('subtitle', models.TextField(blank=True, verbose_name='content')),
 #               ('show_subtitle', models.BooleanField(default=True, verbose_name='show subtitle')),
 #               ('alignment', models.CharField(choices=[('left', 'left'), ('center', 'center')], default='center', max_length=10, verbose_name='text alignment')),
 #               ('button', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cms.Link')),
 #           ],
 #           options={
 #               'verbose_name': 'Disclaimer Panel',
 #           },
 #           bases=('cms.abstractpanel',),
 #       )

然后发生了第二个问题,同时携带我的manage.py migrate

2 -ProgrammingError: column "http_request_lang" of relation "cms_dynamicsettings" does not exist

我通过手动编辑迁移文件来解决此问题,注释以下行

#operations = [
#    migrations.RemoveField(
#        model_name='dynamicsettings',
#        name='http_request_lang',
#    ),
#]

manage.py能够完全运行。然后我跑了manage.py makemigrations,它给了我最后一个文件

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        ('cms', '0088_merge_20190411_1655'),
    ]

    operations = [
        migrations.CreateModel(
            name='DisclaimerPanel',
            fields=[
                ('abstractpanel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.AbstractPanel')),
                ('title', models.CharField(blank=True, max_length=1024, verbose_name='title')),
                ('show_title', models.BooleanField(default=True, verbose_name='show title')),
                ('subtitle', models.TextField(blank=True, verbose_name='content')),
                ('show_subtitle', models.BooleanField(default=True, verbose_name='show subtitle')),
                ('alignment', models.CharField(choices=[('left', 'left'), ('center', 'center')], default='center', max_length=10, verbose_name='text alignment')),
                ('button', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cms.Link')),
            ],
            options={
                'verbose_name': 'Disclaimer Panel',
            },
            bases=('cms.abstractpanel',),
        ),
        migrations.RemoveField(
            model_name='dynamicsettings',
            name='http_request_lang',
        ),
    ]

通过上述更改,我可以运行manage.py runserver.

然后我将这 3 个文件添加到我的合并分支并为我的分支创建一个远程存储库。

创建的每个新存储库都通过单元测试运行,并且存在问题,因为它没有考虑到我新提交的三个文件。

它给了我以下错误,与第 2 点中的错误相同(见上文)。

ERROR:  relation "cms_dynamicsettings" does not exist at character 1508

使用我的开发环境作为模板,我的猜测是 circle ci 正在复制我遇到的相同问题并且我手动修复了该问题。

问题如下:

  • 有没有办法在我的模型cms_disclaimer通过那个该死的迁移文件之前删除它?如果是,如何?

  • 有没有办法不考虑迁移文件并告诉它不要删除列http_request_lang

  • 我的最后一个问题是为什么manage.py makemigrations没有看到数据库中的变化?

还有一个信息:

该数据库是使用分支主服务器构建的。我在另一个基于 master 的分支上结帐,将我的 dev 分支合并到 master 中,然后执行manage.py migrate

任何信息都会受到欢迎,因为我正在失去理智。

谢谢。

4

1 回答 1

1

这种情况下的过程是确保您首先进入与数据库同步的状态(假设您无法删除数据库,因为系统处于生产状态)。

  1. 签入您的生产数据库表“django_migrations”并查看应用于每个应用程序的最后一次迁移。
  2. 在您的代码中,删除上次迁移后添加的所有迁移文件。为每个应用程序执行此操作。确保应用到您的数据库的所有迁移文件都存在于您的代码仓库中。
  3. Run manage.py migrate,如果您的迁移文件与您的数据库同步,它应该什么都不做(“无迁移”)。
  4. 运行manage.py makemigrations这将创建一个额外的迁移文件,该文件反映模型中相对于数据库的所有更改。
  5. 运行manage.py migrate,现在一切都应该正常工作。

执行此操作时需要担心的一些事项:

  • 确保您使用的所有数据库(在所有环境中)都与生产数据库同步。
  • 确保没有人在可能存在其他迁移的不同分支上工作。
于 2019-05-24T14:52:19.023 回答