底线:在使用 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 数据库会发生这种情况,但只是有时.
在上面的查询中,我希望 df1 和 df2 不同,因为“默认”和“客户”数据库不同。但是,有时,连接游标无法正确“查看”第二个数据库中的所有信息。
奇怪的是,当我打印时,连接设置显示不同:
print(connections.databases)
“connections”对象包含两个不同的数据库,但其中一个是“测试”数据库。 print 语句生成一个字典,但请注意“测试客户":
(pdb) { 'default': { <conn info>}, 'test_customers': { <conn info> } }
Django 似乎正在尝试建立一个测试数据库,但失败了,并且没有通过测试,因为“test_customers”中的表与生产中的表不同。
如何解决此问题,以便 pytest-django 在测试期间始终看到第二个数据库(客户)中的表?我在数据库的设置和拆卸方面做错了什么吗?
UPDATE: 正在阅读关于数据库创建/重用的 pytest-django 文档 http://pytest-django.readthedocs.io/en/latest/database.html为我指明了正确的方向。然而,我对文档的这一部分有点不安:
目前 pytest-django 并不专门支持 Django 的
多数据库支持。但是,您可以使用普通的 Django TestCase
实例使用其 multi_db 支持。
如果您对支持多个数据库的最佳 API 有任何想法
直接在 pytest-django 请联系我们,我们感兴趣
最终支持这一点,但不确定是否简单地遵循 Django
方法。