2015-07-10 34 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'