我有 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=""),
"PASSWORD": config("DB_PASSWORD", default=""),
"HOST": config("DB_HOST", default="db"),
"PORT": 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=""),
"PASSWORD": config("DB_PASSWORD", default=""),
"HOST": config("DB_HOST", default="db"),
"PORT": config("DB_PORT", default=""),
},
}
对于“数据”,我使用了命令
python manage.py inspectdb --database=data > apps/data/models.py
得到了这样的 models.py:
class Product(models.Model):
id = models.AutoField(primary_key=True)
...
class Meta:
managed = False
db_table = "Product"
我尝试创建一些 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" table does not exists
所以我需要使用现有的数据库模式“数据”而不创建迁移,并像往常一样使用默认模式。
我已经尝试过https://pytest-django.readthedocs.io/en/latest/database.html但它在我的情况下不起作用。关于如何运行 pytest 有什么想法吗?
直接在测试中使用“生产”数据库是一个坏主意。
这就是为什么 Django 会坚持为你创建单独的测试数据库。要填充测试数据库,请将产品数据转储到固定装置中,然后在测试中加载该固定装置:
如果您坚持直接使用现有数据库,有一节介绍如何使用 pytest:https://pytest-django.readthedocs.io/en/latest/database.html#using-an-existing-external -测试数据库