You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:35:30