运行测试时Django关系不存在
Posted
技术标签:
【中文标题】运行测试时Django关系不存在【英文标题】:Django relation does not exist when running test 【发布时间】:2020-03-09 01:42:30 【问题描述】:我正在使用 Django 2.2.3
和 Postgres。
我正在尝试将测试添加到项目中,并且在执行python ./manage.py test
或python ./manage.py test app_name
时,在测试数据库创建步骤中不断遇到错误django.db.utils.ProgrammingError: relation "auth_group" does not exist
。
首先,我的建议是我有点弄乱了我的数据库架构 - 前段时间开发团队被要求从另一个数据库导入几个表,我已经通过直接完成了使用 pgsql 导入。然后我使用python manage.py inspectdb
创建模型并将它们放入单独的应用程序中。
该命令创建了一个初始迁移,如下所示:
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name='SomeModelName',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('some_other_field)', models.CharField(max_length=254, unique=True)),
],
options='db_table': 'some_existing_table_name', 'managed': False,,
),
一切正常,因为我创建并应用了多个迁移,没有任何问题。但现在我遇到了那个测试问题。
经过简短调查,我发现inspectdb
还为一些 auth 表创建了模型,并且它们存在于具有旧表的应用程序的 models.py 中。因此,在讨论的应用程序的初始迁移中存在以下几行:
migrations.CreateModel(
name='AuthGroup',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('name', models.CharField(max_length=80, unique=True)),
],
options='db_table': 'auth_group', 'managed': False,,
),
在models.py中:
class AuthGroup(models.Model):
name = models.CharField(unique=True, max_length=80)
class Meta:
managed = False
db_table = 'auth_group'
我认为,这可能与问题有关,但我已尝试从 INSTALLED_APPS
中删除该应用程序,完全删除该应用程序,但没有任何效果。我在运行测试时仍然遇到这些错误
任何想法,我可以做些什么来解决这个问题? 也许,这种行为是由其他原因引起的?
P.S.这个问题与 South package 的问题无关,因为它没有在这个项目中使用。
谢谢。
附言 INSTALLED_APPS
:
INSTALLED_APPS = (
[
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
]
+ PROJECT_APPS
+ THIRD_PARTY_APPS
)
【问题讨论】:
您可能弄乱了旧的迁移文件,删除数据库并重试 由于这些迁移已经在 prod 中应用,您可以从迁移文件中删除与AuthGroup
相关的块,从 INSTALLED_APPS
中删除该应用程序,然后告诉您的测试套件重新创建测试数据库。
@heemayl 它不起作用;(从 INSTALLED_APPS 中删除该应用程序并从迁移中删除这些块(并应用新版本的迁移)后,该错误仍然存在
@AlexShein 您是否重新创建了测试数据库?另外,你能添加完整的引用吗?
@heemayl 是的,我确实重新创建了它。执行 sql ALTER TABLE "auth_user_groups" ADD CONSTRAINT "auth_user_groups_group_id_97559544_fk_auth_group_id" FOREIGN KEY ("group_id") REFERENCES "auth_group" ("id") DEFERRABLE INITIALLY DEFERRED
失败。回溯链接:gist.github.com/AlexShein/e2224bbdffb2f18b4e0ff2f9cf052961
【参考方案1】:
我发现问题与自定义用户模型有关,它的声明方式如下:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
class Meta:
db_table = 'auth_user'
事实证明,用默认的 Django 用户替换它解决了这个问题。
【讨论】:
以上是关于运行测试时Django关系不存在的主要内容,如果未能解决你的问题,请参考以下文章
Django.db.utils.ProgramingError 关系不存在
使用多个数据库的 Django 错误关系“auth_user”不存在
使用 South 在 Heroku 上设置 Django 时遇到问题 - 不断出现 ProgrammingError:关系不存在