如何处理“关系“ cms_disclaimerpanel”已存在”并且ProgrammingError:关系“ xyz”的列“ http_request_lang”不存在

时间:2019-05-24 12:51:18

标签: python django git django-models makemigrations

尝试将合并发送到Circle CI上的自动化测试时,我遇到了一个很烦人的问题。

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

我正在使用django,并且已经完成了从本地dev分支到本地master分支的合并。合并进行得很顺利。但是,通过manage.py runserver启动django服务器时,它会给我警告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-{{​​1}}

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

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', ), ]

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

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

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

manage.py runserver

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

问题如下:

  • 在模型ERROR: relation "cms_dynamicsettings" does not exist at character 1508 通过该死的迁移文件运行之前,是否有办法删除它?如果是,怎么办?

  • 是否有一种方法可以不考虑迁移文件并告诉它不要删除列cms_disclaimer

  • 我的最后一个问题是为什么http_request_lang看不到数据库中的更改?

更多信息:

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

在我失去理智的情况下,任何信息都将受到欢迎。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 确保在所有环境中使用的所有数据库都与生产数据库保持同步。
  • 确保没有人正在另一个可能存在其他迁移的分支上工作。