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

Sco*_*les 9 django pytest pytest-django

结论:在使用pytest-django测试期间,我的Django连接对象没有看到第二个数据库的表关系.

概述: 我有一个问题,我的Django连接对象似乎得到错误的数据库信息.我偶然发现了这个问题,当我在"客户" DB查询在桌子上,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'
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在目录上运行'pytest'时,下面的两个游标都从'default'数据库中获取信息:

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)
Run Code Online (Sandbox Code Playgroud)

df1和df2的结果完全相同:只有'default'数据库中的表名.

使用pytest-django并使用第二个Postgres数据库会发生这种情况,但有时只会发生.

在上面的查询我希望DF1和DF2是不同的,至今为"默认"和"客户数据库是不同的.但是,有时,连接光标无法正确"查看"第二个数据库中的所有信息.

奇怪的是,打印时连接设置显示不同:

print(connections.databases)
Run Code Online (Sandbox Code Playgroud)

'connections'对象包含两个不同的DB,但其中一个是"test"DB.print语句产生一个字典,但请注意" test_customers ":

(pdb) { 'default': { <conn info>}, 'test_customers': { <conn info> } }
Run Code Online (Sandbox Code Playgroud)

似乎Django试图建立一个测试数据库,失败,并且没有通过测试,因为'test_customers'中的表不像生产中那样存在.

我如何解决这个问题,以便pytest-django总能在测试期间看到第二个数据库(客户)中的表?我在安装和拆卸数据库时遇到了什么问题吗?

更新:阅读关于数据库创建/重用pytest-django文档,我指出了正确的方向.但是,我对这部分文档感到有些不安:

目前pytest-django并不特别支持Django的多数据库支持.但是,您可以使用普通的Django TestCase实例来使用其multi_db支持.

如果您对pytest-django中直接支持多个数据库的最佳API有任何想法请联系我们,我们有兴趣最终支持这个但不确定只是遵循Django的方法.

ill*_*nan 4

pytest-django 不支持多数据库。当我尝试使用多个数据库和参数时--reuse-db/--create-db结果是,有时它有效(所有数据库都已创建并且可以正确使用),有时它不起作用(数据库未创建或 Django 抱怨数据库已经存在)。

恕我直言,有两种选择:1)不要将 pytest 与 Django 一起使用;2)简化您的测试,这样您就不需要多个数据库。对于选项 2) 我正在使用此设置:

普通的settings

DATABASES = {
    'default': ...,
    'secondary': ...,
}
Run Code Online (Sandbox Code Playgroud)

pytest.ini

[pytest]
...
DJANGO_SETTINGS_MODULE=my_app.settings.test
...
Run Code Online (Sandbox Code Playgroud)

test.py

# Import all from normal settings
from .base import *

DATABASES.pop('secondary')
# This will route all queries and migrations to the default DB
DATABASE_ROUTERS = []
Run Code Online (Sandbox Code Playgroud)