gpt4 book ai didi

python - 搭建Django测试环境时如何创建外部数据库?

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:38 26 4
gpt4 key购买 nike

我的 Django 应用程序需要连接一个非托管的(不是由 Django 管理的)外部 Postgres 数据库。

为了测试我的项目,我需要使用原始 SQL 创建外部数据库和表,然后删除数据库。

通过阅读 Django 文档,可以使用现有的 DiscoverRunner 类创建自己的 TestRunner 类。 setup_test_environmentteardown_test_environment 方法可以被覆盖以执行 SQL 以创建外部数据库:

from psycopg2 import connect
from django.test.runner import DiscoverRunner

class CustomTestRunner(DiscoverRunner):
"""
Test runner that helps to setup external db if doesn`t exist.
"""

def setup_test_environment(self, *args, **kwargs):
conn = connect(database='postgres', host='localhost', user='my_user', password='password123')
try:
with conn.cursor() as c:
query = """CREATE DATABASE "test_db" """
query += """WITH OWNER = my_user """
query += """ENCODING = 'UTF8' TABLESPACE = pg_default """
query += """LC_COLLATE = 'en_ZA.UTF-8' LC_CTYPE = 'en_ZA.UTF-8' """
query += """CONNECTION LIMIT = -1;"""
c.execute(query)
except Exception as e:
print e
conn.close()

super(CustomTestRunner, self).setup_test_environment(*args,
**kwargs)

def teardown_test_environment(self, *args, **kwargs):
super(CustomTestRunner, self).teardown_test_environment(*args,
**kwargs)

# Delete external database after tests
try:
conn = connect(database='postgres', host='localhost', user='my_user', password='password123')
with conn.cursor() as c:
query = """DROP DATABASE test_db;"""
c.execute(query)
except Exception as e:
print e
conn.close()
conn.close()

但是,当我运行测试时,我收到以下错误消息:

CREATE DATABASE 不能在事务 block 内运行

是否可以在 Django TestRunner 中运行和提交 SQL?如果不是,创建此类外部数据库的合适位置在哪里?

最佳答案

CREATE DATABASE 等一些数据库命令不能在事务中运行。您需要在数据库连接上设置适当的隔离级别:

conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)

参见 http://initd.org/psycopg/docs/extensions.html#isolation-level-constants .

也可以在测试运行器中运行和提交 SQL。更合适的地方是在 setup_databsesteardown_databases 方法中。这是一个例子

def setup_databases(self, **kwargs):
conn = connect(database='postgres', host='localhost', ...)
try:
# set the proper isolation level so CREATE DATABASE works
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
with conn.cursor() as cur:
# execute SQL in here
query = 'create database TEST_DB'
cur.execute(query)
finally:
conn.close()

return super(CustomTestRunner, self).setup_databases(**kwargs)

teardown_databases 的实现应该非常相似。

关于python - 搭建Django测试环境时如何创建外部数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com