我为我的 API 设置了默认模式,并为数据搜索设置了现有模式。这是数据库设置:
DATABASES = {
"default":{
"ENGINE": "django.db.backends.postgresql"、
"OPTIONS":{"options": "-c search_path=public"}、
"NAME":config("DB_NAME", default="")、
"USER":config("DB_USER_NAME", default="")、
"密码":config("DB_PASSWORD", default="")、
"HOST":config("DB_HOST", default="db")、
"端口":config("DB_PORT", default="")、
},
"data":{
"ENGINE": "django.db.backends.postgresql"、
"OPTIONS":{"options": "-c search_path=data"}、
"NAME":config("DB_NAME", default="")、
"USER":config("DB_USER_NAME", default="")、
"密码":config("DB_PASSWORD", default="")、
"HOST":config("DB_HOST", default="db")、
"端口":config("DB_PORT", default="")、
},
}
对于 "data",我使用了命令
python manage.py inspectdb --database=data > apps/data/models.py
得到的models.py是这样的:
class Product(models.Model): id = models.AutoField(primary_key=True) ... 类 Meta managed = False db_table = "产品";
我试着创建了一些 pytest:@pytest.mark.django_db(databases=["default", "data"], transaction=True) class TestSomeTestAPIView: view_name = "some-view-name"; def test_some_test_name(self, auth_client): print(Product.objects.using("data").all())
结果出现错误
因此,我需要使用现有的数据库模式"数据",而无需创建迁移,并像往常一样使用默认模式。"Product" 表不存在
我试过 https://pytest-django.readthedocs.io/en/latest/database.html 但在我的情况下不起作用。您知道如何运行 pytests 吗?
错误信息
"Product" 表不存在
表明 Django 在错误的 schema 中查找该表。尽管已在数据库设置中正确配置了
data
schema,但在运行测试时,Django 可能仍使用默认 schema。
以下是如何使用现有数据库 schema “data” 运行 pytest,而无需创建迁移并在 pytest 中使用
data
数据库连接:
1. 修改 models.py:
需要告诉 Django
Product
模型位于
data
schema 中。可以通过在
Product
模型的
Meta
类中指定
schema
属性来实现这一点:
class Product(models.Model):
id = models.AutoField(primary_key=True)
...
class Meta:
managed = False
db_table = '产品'
schema = 'data'
2. 使用 pytest fixtures 设置数据库路由:
可以创建一个 pytest fixture 来临时修改数据库路由,以在测试期间使用
data
schema:
import pytest
@pytest.fixture(scope='function')
def use_data_schema(settings):
router = settings.DATABASE_ROUTERS[0]
old_allow_migrate = router.allow_migrate
def allow_migrate_data(self, db, app_label, model_name=None, **hints):
if db == 'data':
return True
return old_allow_migrate(self, db, app_label, model_name, **hints)
router.allow_migrate = allow_migrate_data
yield
router.allow_migrate = old_allow_migrate
@pytest.mark.django_db(transaction=True)
class TestSomeTestAPIView:
view_name = "some-view-name"
@pytest.mark.usefixtures('use_data_schema')
def test_some_test_name(self, auth_client):
print(Product.objects.using("data").all())
这个 fixture 做了以下事情:
- 获取默认的数据库路由器。
-
修改
allow_migrate
方法,允许在data
数据库上进行迁移操作。 -
在测试结束后,将
allow_migrate
方法恢复到原始状态。
3. 运行的测试:
现在,当运行 pytest 时,它应该能够找到
data
schema 中的
Product
表。确保使用
using("data")
来查询
Product
模型,以便 Django 使用正确的数据库连接。
其他注意事项:
-
如果在
settings.py
中定义了自定义数据库路由器,则需要相应地调整 fixture。 - 确保已为测试环境正确配置了数据库连接设置。
通过这些修改,应该能够使用现有的数据库 schema “data” 运行 pytest,而无需创建新的迁移。
标签:django,orm,pytest,web-api-testing,pytest-django From: 78590076