Django 和 postgresql 测试模式

标签 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 模式。

我部分解决了这个问题并将模式名称 public 添加到搜索路径

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

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

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

最佳答案

我最终编写了一个自定义测试运行器来解决这个问题(使用 django 1.9.x):

myapp/test/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'

关于Django 和 postgresql 测试模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31346655/

相关文章:

python - 如何访问模型定义中外键的值?

Django 查询数据库并将数据发送到模板

postgresql - 从 PostgreSQL 全文搜索中获取匹配的词素列表?

postgresql - INSERT 到只有一个序列列的表实际上并没有插入任何东西

python - 带有德语变音符号的 psycopg2 unicodeencodeerror

django - 如何关闭 Sentry Web UI 异常跟踪中的变量缩短?

django模型ManyToManyField不通过管理器

sql - 我如何正确地将这两个 PSQL 查询连接在一起?

delphi - 'hex' 或 'escape' 中的 PostgreSQL 9.X bytea 表示形式用于缩略图

Python psycopg2 超时