Django REST Framework测试报relation 'user'不存在错误
问题描述
参照Django REST Framework官方文档指引编写并执行测试用例时,无论测试什么功能模块,始终会抛出相同的数据库报错。
测试用例示例
class TestRequestFactory(APITestCase): def test_request(self): factory = APIRequestFactory() request = factory.post('/list_user/', json.dumps({'title': 'new idea'}), content_type='application/json')
报错信息
django.db.utils.ProgrammingError: relation "user" does not exist LINE 1: ...ted_by", "user"."created_ts", "user"."is_active" FROM "user"
已尝试的无效操作
- 执行
manage.py migrate - 执行
manage.py migrate --fake bots zero
查阅大量技术资料找到的通用解决方案均已尝试,问题始终未解决,依旧抛出相同错误。
根因与修复方案
这个报错本质是程序运行时找不到名为user的数据库表,常规迁移命令无效说明问题不在本地开发库的迁移状态,按以下顺序排查即可:
- 检查自定义用户模型配置
打开项目settings.py文件,确认存在AUTH_USER_MODEL = 'User模型所在app名.User'配置。如果漏写该配置,Django会默认查找内置的auth_user表,和自定义的user表名不匹配,就会报表不存在错误。 - 排查全局提前触发的查询逻辑
你写的测试代码本身仅构造请求对象,没有执行视图逻辑,但如果项目配置了全局中间件、全局权限校验类,会在请求初始化阶段就查询用户表。如果此时测试环境未完成对应表的创建,就会直接抛错。可以给这类全局逻辑加测试环境跳过判断,或者在测试用例中提前mock用户查询逻辑。 - 重置损坏的迁移文件
带--fake参数的迁移命令很容易打乱迁移记录,直接按步骤重置即可:- 删除所有app目录下
migrations文件夹中除__init__.py之外的所有文件 - 删除本地数据库文件(使用sqlite则直接删除
db.sqlite3,使用MySQL/PostgreSQL则删除对应库后重建) - 依次重新执行
python manage.py makemigrations、python manage.py migrate
- 删除所有app目录下
- 校验测试数据库配置
如果你手动为测试环境配置了固定数据库名,检查settings.py中数据库配置的TEST字段是否正确,不要指向未执行过迁移的空库。使用Django默认测试配置时,框架会自动创建临时测试库、执行完全部迁移后再运行用例,只要迁移文件正常就不会出现该报错。
内容的提问来源于stack exchange,提问作者Ivan Campelo
相关产品推荐
相关产品推荐

