Django和PostgreSQL测试模式

15
我将为您翻译以下内容:

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

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

我们定义了这个模式,然后需要添加

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

前往设置。

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

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

我获得的错误是

django.db.utils.ProgrammingError: 未选择模式以进行创建

当我查看创建的数据库时,默认情况下会创建public模式。

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

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

但我希望使用自定义模式名称创建测试数据库。

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


1
这里也有同样的问题 - 你找到解决方案了吗,你可能想要分享一下? :) - dahrens
1
不,我从未找到解决方案。我已经离开了这份工作,完全忘记了这个问题。自从我发布这个问题以来已经过去了一年,你的回答是迄今为止唯一的答案。 - Jorge Omar Vázquez
2
我也在寻找一种解决方案,使django使用非公共模式。这里似乎有一个关于此的线程: https://code.djangoproject.com/ticket/22673#no1 要修复django,或者我已经发现了这个可能的解决方案: https://github.com/bernardopires/django-tenant-schemas - Lingster
1个回答

19

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

1
谢谢,这节省了我很多调试时间。对于Postgres 11.x、Django 2.2.x和Psycopg 2.8.x仍然像魅力一样工作。 - user2390182
如何在截断表时禁用外键约束?在运行程序中是否可以使用teardown_databases()? - Kode Kite
@KodeKite 在此之前禁用触发器。 - kerfuffle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接