Django 和 postgresql 测试模式
Django and postgresql testing schema
我正在使用 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'
我正在使用 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'