g –运行测试会引发psycopg2.IntegrityError:“ draft_title”列中的null值违反了非null约束

时间:2018-08-23 12:00:43

标签: django wagtail

我正在尝试运行我的应用程序测试(Django v1.11和Wagtail v2.2.1),但是在测试创建测试数据库时出现异常:

Traceback (most recent call last): File "/home/fleon/.virtualenvs/virmyasb/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) psycopg2.IntegrityError: null value in column "draft_title" violates not-null constraint DETAIL: Failing row contains (3, 0001, 1, 1, Root, root, t, f, /, , f, , null, null, f, 1, null, f, null, null, null, null, null).

查看完整的堆栈跟踪时,Wagtail文件内有错误:

[...] lib/python3.6/site-packages/wagtail/core/migrations/0001_squashed_0016_change_page_url_path_to_text_field.py", line 30, in initial_data [...]

此类行中的Python代码为:

# Create root page
root = Page.objects.create(
    title="Root",
    slug='root',
    content_type=page_content_type,
    path='0001',
    depth=1,
    numchild=1,
    url_path='/',
) 

未设置草稿标题,因此违反了非空约束。

请注意,我正在使用两个不同的数据库(base.py):

DATABASES = {
    'default': dj_database_url.config(),
    'thedbname': {
        'NAME': 'thedbname',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'thedbuser',
        'PASSWORD': '***',
        'HOST': 'myhost',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        },
    }
}

如果删除MySQL数据库(?),测试就可以正常工作

1 个答案:

答案 0 :(得分:0)

在迁移Page.draft_title中,wagtail/core/migrations/0040_page_draft_title.py字段已添加到Wagtail中。由于迁移总是在模型的冻结版本上进行,因为它是在迁移时已经存在的,因此0001_squashed_0016_change_page_url_path_to_text_field.py中的代码是有效的-draft_title当时不存在。

该错误表明由于某种原因迁移发生在正常顺序之外-我建议检查项目中的迁移是否存在任何可能影响顺序的依赖项,例如run_before-或正在重新-在已经应用了迁移的数据库上运行(但没有将它们记录在django_migrations表中,因此Django对此不了解)。