pytest-django中无法向PostgreSQL插入数据的原因排查
问题核心原因
pytest-django 默认会为每个测试用例启动数据库事务,你在 fixture 中创建的对象处于未提交的事务内,而 Django admin 访问的是数据库主连接,无法读取未提交的事务数据。同时,测试结束后 pytest-django 会自动回滚事务,所以即便等待也看不到数据。
解决方案
1. 临时关闭事务隔离(仅用于验证)
如果只是想临时在 admin 中看到数据,可以修改 pytest 配置,关闭自动事务回滚:
在项目根目录的 pytest.ini 或 tox.ini 中添加:
[pytest] django_use_transactions = False
这种方式会直接提交数据到数据库,休眠期间能在 admin 看到对象,但测试后不会自动清理数据,需要手动处理。
2. 手动提交事务(破坏测试隔离,谨慎使用)
在 fixture 中手动提交事务,让数据写入主库:
import pytest from django.db import transaction from your_app.models import Vertical # 替换为你的模型路径 import time @pytest.fixture(autouse=True) def populate_db(): sport = Vertical.objects.create(name='sport') bazar = Vertical.objects.create(name='bazar') # 手动提交事务 transaction.commit() time.sleep(60) yield # 测试结束后手动清理数据 Vertical.objects.filter(name__in=['sport', 'bazar']).delete()
3. 用测试代码验证(推荐方式)
无需依赖 admin 面板,直接在测试用例中验证数据是否创建:
def test_populate_data(): assert Vertical.objects.filter(name='sport').exists() assert Vertical.objects.filter(name='bazar').exists()
这种方式符合测试规范,既能确认数据创建成功,又能保持测试用例的隔离性。
额外排查点
- 确认 pytest 使用的数据库配置和 Django 主服务一致,检查
settings.py或pytest.ini中的DATABASES配置,避免连接到不同的数据库实例。 - 在 fixture 中添加打印日志,确认代码确实被执行,比如在创建对象后打印
print(Vertical.objects.count()),验证创建逻辑是否正常运行。
内容的提问来源于stack exchange,提问作者milad heidari
相关产品推荐
相关产品推荐

