尝试将我的合并发送到我在循环 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
。
任何信息都会受到欢迎,因为我正在失去理智。
谢谢。