在使用pytest-django进行测试期间,Django连接对象看不到第二个数据库的表

问题描述 投票:9回答:2

底线:使用pytest-django测试期间,我的Django连接对象看不到第二个数据库的表关系。

概述:我有一个问题,我的Django连接对象似乎获得了错误的数据库信息。当我在“客户”数据库中的一个表上查询时,我偶然发现了这个问题,而Django告诉我该关系不存在。使用settings.py数据库部分的设置如下:

DATABASES = {
    'default': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.postgres',
        'USER': 'postgres_1',
        'PASSWORD': 'superS3cret'
    },
    'customers': {
        'NAME': 'customer_data',
        'ENGINE': 'django.db.backends.postgres',
        'USER': 'postgres_1',
        'PASSWORD': 'superS3cret'
    }
}

当我使用以下命令在目录上运行“ pytest”时,下面的两个游标都从“默认”数据库中获取信息:

sql = """SELECT table_name FROM information_schema.tables WHERE table_nameschema='public'"""

default = connections["default"].cursor()
default.execute(sql)
raw_data = default.fetchall()
sql_columns = [col[0] for col in default.description]
df1 = pd.DataFrame(raw_data, columns=sql_columns)

customers = connections["customers"].cursor()
customers.execute(sql)
raw_data = customers.fetchall()
sql_columns = [col[0] for col in customers.description]
df2 = pd.DataFrame(raw_data, columns=sql_columns)

df1和df2的结果完全相同:仅'default'数据库中的表名。

这种情况在pytest-django并使用另一个Postgres数据库时发生, 在上面的查询中,只要'default'和'customers'数据库不同,我希望df1和df2是不同的。但是,有时连接游标无法正确地“查看”第二个数据库中的所有信息。

奇怪的是,当我打印时,连接设置以不同的方式显示:

print(connections.databases)

“连接”对象包含两个不同的数据库,但一个是“测试”数据库。打印语句产生一个字典,但请注意“ 

test_customers

”:(pdb) { 'default': { <conn info>}, 'test_customers': { <conn info> } }
好像Django试图建立一个测试数据库,失败了,没有通过测试,因为'test_customers'中的表与生产环境中的表不存在。 

如何解决此问题,以便pytest-django在测试期间始终能看到第二个数据库(客户)中的表?我在设置和拆卸数据库时做错了什么?

UPDATE

:读取pytest-django docs on DB creation/re-use指向正确的方向。但是,我对文档的这一部分有些不满意:
当前pytest-django不专门支持Django的多数据库支持。但是,您可以使用常规的Django TestCase实例以使用其multi_db支持。

如果您对支持多个数据库的最佳API有任何想法,直接在pytest-django中,请与我们联系,我们对最终支持这一点,但不确定是否仅遵循Django的方法。

底线:在使用pytest-django测试期间,我的Django连接对象看不到第二个数据库的表关系。概述:我的问题似乎出现在我的Django连接对象中...

django pytest pytest-django
2个回答
2
投票
[pytest-django does not support multiple databases。当我尝试使用多个数据库和参数--reuse-db / --reuse-db时,结果是,有时它可以工作(创建了所有数据库并且可以正确使用),有时却不起作用(要么没有创建数据库,要么是Django抱怨数据库已经存在)。

0
投票
在test_settings.py->猴子补丁中
© www.soinside.com 2019 - 2024. All rights reserved.