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

Django测试期间查看数据库问题:测试数据库始终为空

搞定Django测试数据库为空的问题

嗨,我来帮你捋捋为啥配置了测试数据库但跑完测试后是空的,这几个常见原因和解决办法你可以挨个排查:

1. Django测试的默认事务回滚在搞鬼

Django自带的TestCase类为了保证每个测试的独立性,默认会在每个测试方法执行前开启事务,测试结束后自动回滚。也就是说,你在test_add_members里创建的pp_castrillon这类数据,测试一结束就被撤销了,所以你打开test_db.sqlite3看不到任何数据——这其实是正常的设计哦。

如果你只是想确认测试中数据确实生成了,不用盯着数据库看,直接在测试方法里加断言就行:

self.assertEqual(Grup.objects.count(), 1)  # 假设你预期创建了1条数据

要是你非要让数据留在数据库里方便调试,有两个办法:

  • 改用TransactionTestCase类:它会在每个测试后截断表(而不是回滚),不过--keepdb只会保留表结构,数据还是会被清掉;
  • 临时在测试最后手动提交事务(只适合调试,别用到正式测试里):
    from django.db import transaction
    transaction.commit()
    

2. 先确认测试数据库配置真的生效了

有时候你改了配置,但Django根本没读到。可以在测试方法里加一行打印,看看当前用的是不是你指定的测试库:

from django.db import connections
print(connections['default'].settings_dict['NAME'])

运行测试后看输出,如果不是test_db.sqlite3,那大概率是你改的配置文件不对,或者有其他地方(比如环境变量、其他配置模块)覆盖了DATABASES的设置。

3. 检查你的测试代码本身

说不定是test_add_members里的代码根本没把数据存进数据库:

  • 是不是创建模型实例后忘了调用save()?比如你写了pp_castrillon = Grup(...)但没加pp_castrillon.save(),用Grup.objects.create(...)才会自动保存;
  • 有没有条件判断跳过了数据创建的逻辑?
  • 是不是模型的save()方法被重写了,导致数据没正确入库?

可以在测试里加个打印看看:

print("当前Grup数据:", Grup.objects.all())

如果输出是空的,那就是测试代码的问题啦。

4. 别误解--keepdb的作用

--keepdb只是让Django不要每次测试都删除重建测试数据库的表结构,节省时间,但它不会保留之前测试的数据。每次测试还是会在干净的表结构上跑,数据该回滚还是会回滚,该截断还是会截断。


内容的提问来源于stack exchange,提问作者Roberto Fernandez Diaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:34:01