2017-02-23 66 views
0

我在使用Django 1.10.5與django-cookiecutter項目設置。我有一個非管理模式,看起來像這樣的:Django測試架構模式未找到

# -*- 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一樣。我的後端是Redshift,這個非管理型號使用django-redshift-backend

如果我只用db_table = 'mytable'運行測試,我的測試數據庫中public模式下的表已成功創建。如果我使用架構如上所示運行db_table的測試,則會收到錯誤消息。

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

我可以在正常情況下用特定的模式應用成功地使用這種模式。爲什麼我在測試時無法在架構中創建表格?

回答

0

我認爲這是因爲您沒有在test_**數據庫中創建stage架構,而stage架構存在於您的「開發/生產」環境中。

我有以下步驟運行,終於成功運行單元測試 (假設數據庫名稱是app):

  1. 轉儲和複製數據庫apptest_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. 
    

test.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,但我認爲它大都是相同的。

+0

感謝您的回覆。它確實看起來像我在我的測試數據庫中創建了階段模式。我在我的DATABASES設置中指定爲我的測試使用名爲test的數據庫。 – duffn

+0

@duffn測試數據庫可能在測試後被丟棄嗎? – Enix

+0

我不這麼認爲。 - - 重用數據庫可以防止這種情況。 – duffn