2015-07-10 63 views
4

我使用PostgreSQL 9.3和Django的1.7.4與2.5.4 psycopg2Django和PostgreSQL的測試模式

的DBA,要求我們爲我們的應用程序,而不是使用公共的模式。

我們定義的架構,我們不得不把

'OPTIONS': { 
    'options': '-c search_path=custom-schema-name' 
}, 

添加到設置。

在測試過程中,Django是創建具有相應的名稱測試數據庫,但我們不能設置自定義模式名

我試圖找到一種方法來建立自定義的架構名稱(我請閱讀the docs),但我無法找到在測試過程中強制創建模式名稱的方法。

,我考取的是

django.db.utils.ProgrammingError錯誤:沒有模式已被選定在

當我看到創建的數據庫中創建,它通過創建的模式公開默認。

我可以部分地解決這個問題,並添加到搜索路徑的模式名稱公共

'OPTIONS': { 
    'options': '-c search_path=custom-schema-name,public' 
}, 

,但我想創建一個自定義的架構名稱測試數據庫。

有沒有人知道如何設置測試模式名稱?

+0

同樣的問題在這裏 - 你是否找到了解決方案,你可能想分享? :) – dahrens

+0

不,我從來沒有找到解決方案。我已經離開了這份工作,我完全忘記了這個問題。自從我發佈這一年已經過去了一年,至今爲止,您是唯一的答案。 –

+1

我還在尋找一種解決方案讓django使用非公共模式。似乎這裏有一個關於此的線程:https://code.djangoproject.com/ticket/22673#no1在django中修復,或者我已經找到了這個可能的解決方案:https://github.com/bernardopires/django-租戶架構 – Lingster

回答

4

我結束了編寫自定義的測試運行,以解決這個問題(使用Django的1.9.x):

MYAPP /測試/ runner.py

from types import MethodType 
from django.test.runner import DiscoverRunner 
from django.db import connections 

def prepare_database(self): 
    self.connect() 
    self.connection.cursor().execute(""" 
    CREATE SCHEMA foobar_schema AUTHORIZATION your_user; 
    GRANT ALL ON SCHEMA foobar_schema TO your_user; 
    """) 


class PostgresSchemaTestRunner(DiscoverRunner): 

    def setup_databases(self, **kwargs): 
     for connection_name in connections: 
      connection = connections[connection_name] 
      connection.prepare_database = MethodType(prepare_database, connection) 
     return super().setup_databases(**kwargs) 

settings.py

TEST_RUNNER = 'myapp.test.runner.PostgresSchemaTestRunner'