Django测试运行失败的"关系不存在"错误

时间:2017-11-27 18:58:47

标签: python django postgresql django-rest-framework

我在运行测试时发现错误,即$ ./manage.py test --settings=my.test.settings django.db.utils.ProgrammingError: relation "<relation name>" does not exist

这是在运行./manage.py makemigrations && migrate

之后

2 个答案:

答案 0 :(得分:2)

最终,由于未能为新应用程序创建初始迁移,导致(通常)此错误。运行$ ./manage.py makemigrations <my new app module name> && migrate

解决了错误

注:makemigrations 不会自动为新应用创建初始移植

答案 1 :(得分:1)

发生此错误是因为我试图运行一段在Django启动时访问数据库的代码。

# file name: blog/apps.py

from django.apps import AppConfig


class BlogConfig(AppConfig):
    name = 'blog'

    def ready(self):
        from .business import markdown_to_html
        markdown_to_html.refresh_posts() # This method access the database.

然后,当我执行测试:python manage.py test时,此代码段已执行,并且出现了您提到的错误。

为什么?此处说明:https://docs.djangoproject.com/en/3.0/ref/applications/#django.apps.AppConfig.ready

由于只需要执行一次此方法,所以我决定创建一个管理命令。

代码如下:

# file name: md_to_html.py

from django.core.management.base import BaseCommand
from blog.business import markdown_to_html


class Command(BaseCommand):
    help = 'Convert posts written in markdown to html'

    def handle(self, *args, **options):
        markdown_to_html.refresh_posts()
        self.stdout.write(self.style.SUCCESS('HTML files created'))

在开始Django项目之前,我使用以下行执行命令:python manage.py md_to_html。通过这种方式,我确保此代码只能安全地执行一次。

现在,当我运行测试时,我不再收到错误。

在这里您可以找到有关如何在Django中创建自定义管理命令的更多信息:https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/

此链接描述了如何测试自定义管理命令:https://docs.djangoproject.com/en/3.0/topics/testing/tools/#topics-testing-management-commands