Skip to main content
 首页 » 编程设计

python之Django 测试模式之未找到模式

2024年10月01日39jyk

我在使用 django-cookiecutter 的项目设置中使用 Django 1.10.5。我有一个看起来像这样的非托管模型:

# -*- coding: utf-8 -*- 
from django.db import models 
from django.conf import settings 
 
 
class MyModel(models.Model): 
    """Base account model.""" 
    account_nm = models.CharField(max_length=255, blank=True, null=True, 
                                  db_column='customer_nm') 
 
    class Meta: 
        app_label = 'mylabel' 
        db_table = '"stage"."mytable"' 
        managed = False if not settings.TESTING else True 

托管设置旨在在我测试时创建我的表,但在其他情况下不会。我正在使用 django-pytest 运行我的测试,就像 py.test --reuse-db 一样。我的后端是使用 django-redshift-backend 的非托管模型的 Redshift。

如果我只使用 db_table = 'mytable' 运行测试,我的表会在测试数据库的 public 模式中成功创建。如果我使用如上所示的 db_table 模式运行测试,我会收到一个错误。

E               django.db.utils.ProgrammingError: schema "myschema" does not exist 
E               LINE 1: CREATE TABLE "myschema"."mytable" (.... 

在正常情况下,我可以在具有特定模式的应用程序中成功使用此模型。为什么我在测试时无法在我的模式中创建表?

请您参考如下方法:

我认为那是因为您还没有在 test_** 数据库中创建 stage 模式,而 stage 模式存在于您的“开发/生产”环境。

我按照以下步骤运行,终于成功运行了单元测试 (假设数据库名称是 app):

  1. 将数据库 app 转储并复制到 test_app。
  2. 确保 stage 模式是在 test_app 下创建的,mytable 是在 stage 模式下创建的。 (我有节制地打开managed选项并运行python migrate,这样我就可以让django为我创建mytable)
  3. 使用 django 单元测试命令运行:

    python manage.py test --keepdb  # --keepdb is available from django 1.8 and later. 
    

测试.py

from django.test import TestCase 
from app.models import MyModel 
 
 
class TestMyModel(TestCase): 
 
    def testRetrieve(self): 
        self.assertRaises(MyModel.objects.get(pk=1)) 

我还没有尝试过 pytest,但我认为它大体上是一样的。