django - RuntimeError: 不允许数据库访问,使用“django_db”标记,或“db”或“transactional_db”fixture 来启用它
问题描述
我正在尝试运行 pytest 并收到此错误:
RuntimeError: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.
我在 test_models.py 中有以下测试,检查 uuid 是否已添加到用户(它在自动添加上):
import pytest
from backendapps.core.models import User
pytestmark = pytest.mark.django_db
class TestUserModel():
user = User.objects.create()
assert user.uuid is not None
我在根级别还有一个名为 conftest.py 的夹具文件。
import pytest
from backendapps.core.models import Org, User
@pytest.fixture(autouse=True)
def enable_db_access(db):
pass
然后我也有这个 pytest.ini 在根级别:
[pytest]
testpaths = backendapps
addopts = --ds=config.settings.local --reuse-db --create-db
python_files = tests.py test_*.py *_tests.py```
我的测试数据库设置为:
'TEST': {
'NAME': 'project_test_db',
},
浏览其他帖子,这是我采取的调试步骤:
- 添加
pytestmark = pytest.mark.django_db
行 - 我有这个 - 检查数据库权限 - 我的用户具有超级用户权限
- 检查数据库上的迁移错误 - 我将所有迁移迁移到零并重新运行它们以检查迁移时是否有任何手动设置,一切都很好。
关于尝试什么或如何获得更清晰的错误有任何想法吗?
完整错误:
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR collecting backendapps/core/tests/test_models.py ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
backendapps/core/tests/test_models.py:18: in <module>
class TestUserModel():
backendapps/core/tests/test_models.py:27: in TestUserModel
user = User.objects.create()
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/manager.py:85: in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/query.py:447: in create
obj.save(force_insert=True, using=self.db)
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/base.py:753: in save
self.save_base(using=using, force_insert=force_insert,
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/base.py:790: in save_base
updated = self._save_table(
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/base.py:895: in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/base.py:933: in _do_insert
return manager._insert(
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/manager.py:85: in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/query.py:1249: in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/models/sql/compiler.py:1395: in execute_sql
with self.connection.cursor() as cursor:
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/utils/asyncio.py:26: in inner
return func(*args, **kwargs)
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/backends/base/base.py:259: in cursor
return self._cursor()
../../.local/share/virtualenvs/projectAPI-NVQT3lgx/lib/python3.8/site-packages/django/db/backends/base/base.py:235: in _cursor
self.ensure_connection()
E RuntimeError: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.
================================================================================= short test summary info ==================================================================================
FAILED backendapps/core/tests/test_models.py - RuntimeError: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Results (0.49s):
解决方案
我猜这个错误是由于您试图直接在测试对象上创建用户。因此,代码将在设置数据库之前执行,因此会出现错误。
您可能会尝试在测试方法中创建用户:
class TestUserModel:
def test_user_uuid_is_not_none(self):
user = User.objects.create()
assert user.uuid is not None
或者你可以简单地运行一个测试功能
def test_user_uuid_is_not_none(self):
user = User.objects.create()
assert user.uuid is not None
如果您需要在测试中多次访问用户,请创建一个夹具并在测试中使用它:
[conftest.py]
@pytest.fixture
def user() -> settings.AUTH_USER_MODEL:
# return the UserFactory (factoryboy)
return UserFactory()
[test_models.py]
import pytest
from django.contrib.auth import get_user_model
pytestmark = pytest.mark.django_db
User = get_user_model()
class TestUserModel:
def test_user_uuid_is_not_none(self, user: User):
assert user.uuid is not None
推荐阅读
- azure - 如何在 Azure 自动化 Runbook 中显示详细输出?
- javascript - 带recaptcha 的地理位置无法在Safari 笔记本电脑上运行(navigator.geolocation)
- typescript - 保存泛型类的任何实例的 TypeScript 变量
- azure - 为什么即使生存时间(Ttl)关闭,惰性索引模式也会删除我在 cosmos 中的数据?
- reactjs - 反应如何在循环中执行异步然后返回反应元素
- javascript - Javascript push() 函数未将对象添加到数组
- javascript - 在画布上添加多个球 onclick
- bash - 期望脚本未在 docker 容器中运行
- c# - 如何在 c# 中找到具有指定值的文件夹?
- azure-powershell - 作为作业调用-AzVMRunCommand