尝试将合并发送到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
。
在我失去理智的情况下,任何信息都将受到欢迎。
谢谢。
答案 0 :(得分:1)
在这种情况下的过程是确保您首先进入与数据库同步的状态(假设由于系统处于生产状态而无法删除数据库)。
manage.py migrate
,如果您的迁移文件与数据库同步,则该操作将不执行任何操作(“不进行任何迁移”)。 manage.py makemigrations
,这将创建一个额外的迁移文件,该文件可以反映模型相对于数据库的所有更改。manage.py migrate
,一切现在应该可以正常工作了。执行此操作时需要担心的一些事情