【发布时间】:2016-05-04 15:05:36
【问题描述】:
设置
几个月前,我将一个应用程序从 Django 1.6 升级到 1.7,然后是 1.8,现在我正在努力升级到 1.9。
在与迁移争吵时,我发现了一个非常讨厌的数据库状态依赖实例 - (不太好)自定义用户模型调用 django.contrib.auth.models.Group 上的一种管理方法。哎呀。因此,当我设置持续集成管道时,我设法通过数据迁移解决了问题,一切都很好。
迁移如下所示:
# import statements left out for brevity
def seed_groups(apps, schema_editor):
Group = apps.get_model('auth', 'Group')
Group.objects.get_or_create(name='group1')
Group.objects.get_or_create(name='group2')
Group.objects.get_or_create(name='group3')
class Migration(migrations.Migration):
dependencies = [('auth', '0001_initial')]
operations = [migrations.RunPython(seed_groups)]
好吧,这不是很好——这里使用get_or_create 允许我们连接一个已经有数据的数据库,而不会让 Postgres 对要求它插入它已经有的行感到非常不安。不过这很有效,我们很高兴露营者能够愉快地进行测试,而且我们的环境都没有出现任何问题。
转折
所以我一直在运行我的测试并修复弃用,更新库,等等等等。因此,令人惊讶的是,我的 CI 环境(一个中等受欢迎的服务)在迁移步骤中未能构建,只是因为 Django 版本从 1.8 更改为 1.9。
我检查过不存在某种缓存依赖链问题(我们正在加载所有正确的库),但错误的回溯非常熟悉......
django.db.utils.ProgrammingError: relation "auth_group" does not exist
LINE 1: ...ELECT "auth_group"."id", "auth_group"."name" FROM "auth_grou...
^
此处提供完整的回溯:https://gist.github.com/alexkahn/b63c41904809cbe53962dc104e4067f0
运行python manage.py migrate --no-input时出现此错误
我为解决问题所做的徒劳尝试:
像这样修改seed_groups函数:
def seed_groups(apps, schema_editor):
# same
db_alias = schema_editor.connection.alias
Group.objects.using(db_alias).get_or_create(name='group1')
# etc...
将initial = True 类属性添加到此应用的0001 迁移中。
将所有迁移压缩为一个。
将我已安装的应用列表直接指向此应用的 AppConfig 子类。
我不知道我在想什么。
底线
有人知道为什么这会突然改变吗?有什么非常明显的事情让我想太多了吗?
【问题讨论】:
-
最好将您的最新更新添加为答案,而不是编辑问题。这样一来,您为解决问题所做的工作就更清楚了。
标签: django