【问题标题】:Django and postgresql testing schemaDjango 和 postgresql 测试模式
【发布时间】:2015-09-29 13:12:28
【问题描述】:

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

DBA 要求我们为我们的应用程序创建一个架构,而不是使用公共架构。

我们定义了架构,我们必须添加

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

到设置。

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

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

我得到的错误是

django.db.utils.ProgrammingError: no schema has been selected to create in

当我看到创建的数据库时,它具有默认创建的公共架构。

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

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

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

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

【问题讨论】:

  • 这里有同样的问题 - 你找到解决方案了吗,你可能想要分享? :)
  • 不,我从未找到解决方案。我已经离开了工作,在这里我完全忘记了这个问题。我发布这个已经一年了,到目前为止,你的答案是唯一的。
  • 我也在寻找让 django 使用非公共架构的解决方案。这里似乎有一个关于这个的线程:code.djangoproject.com/ticket/22673#no1 在 django 中修复,或者我找到了这个可能的解决方案:github.com/bernardopires/django-tenant-schemas

标签: django postgresql psycopg2 django-testing


【解决方案1】:

我最终编写了一个自定义测试运行程序来解决这个问题(使用 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'

【讨论】:

  • 谢谢,这为我节省了很多调试时间。对于 postgres 11.x、django 2.2.x 和 psycopg 2.8.x 来说仍然像魅力一样工作。
  • 截断表时如何禁用外键约束?可以在跑步者中使用 teardown_databases() 吗?
猜你喜欢
  • 2018-11-22
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2015-06-28
  • 2021-01-04
  • 2017-05-18
相关资源
最近更新 更多