Django和postgresql测试架构

时间:2015-07-10 17:15:11

标签: django postgresql psycopg2 django-testing

我正在使用PostgreSQL 9.3和Django 1.7.4以及psycopg2 2.5.4

DBA要求我们为我们的应用程序创建一个模式,而不是使用public。

我们定义了架构,我们不得不添加

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

到设置。

在测试期间,Django正在创建具有相应名称的测试数据库,但我们无法设置自定义模式名称

我试图找到一种设置自定义模式名称的方法(我已阅读the docs)但我找不到在测试期间强制创建模式名称的方法。

我获得的错误是

django.db.utils.ProgrammingError:未选择要在中创建的架构

当我看到创建的数据库时,默认情况下会创建一个公共模式。

我部分解决了这个问题,并在搜索路径中添加了架构名称public

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

但我想用自定义架构名称创建测试数据库。

有人知道如何设置测试模式名称吗?

1 个答案:

答案 0 :(得分: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'