Django单元测试报错:auth_user不存在的本地问题求助
psycopg2.ProgrammingError: relation "auth_user" does not exist的问题 兄弟,我之前也踩过一模一样的坑!结合你说的情况——开发环境跑runserver和migrations都正常、仓库同步到最新版别人没问题,那大概率是测试数据库的初始化出了问题,或者测试代码的执行时机有bug。给你几个针对性的排查和解决步骤:
彻底重置测试数据库
Django的测试环境会用单独的数据库,有时候这个库会残留旧数据或者迁移没跑全。直接试试强制重新创建测试库并执行所有迁移:python manage.py test --noinput要是之前用过
--keepdb参数保留测试数据库,可能会有脏数据残留,这时候可以手动删了测试库再重新跑:# 替换成你的PostgreSQL用户名,进入命令行 psql -U your_db_username # 测试库名称一般是test_加上你的主数据库名 DROP DATABASE test_your_main_db_name; \q # 重新运行测试,Django会自动新建测试库并执行所有迁移 python manage.py test检查测试用例是否提前触发了数据库操作
要是你的测试代码里,在模块导入阶段或者setUpClass这类早于迁移执行的时机就访问了数据库(比如直接查询Profile关联的User),这时候测试库还没创建auth_user表,肯定会报错。
一定要确保所有数据库操作都放在TestCase的测试方法里,而且要用django.test.TestCase(它会自动帮你处理迁移和数据库隔离),别用SimpleTestCase——它压根不处理数据库相关的逻辑。确认Profile模型的迁移依赖
打开grams app的初始迁移文件(grams/migrations/0001_initial.py),看看dependencies里有没有包含auth的迁移。如果没有,手动加上:dependencies = [ ('auth', '__latest__'), # 其他依赖项 ]然后重新生成并应用迁移:
python manage.py makemigrations grams python manage.py migrate grams这样测试时Django就会先执行auth的迁移,再跑grams的迁移,不会出现表不存在的问题。
检查测试命令的参数
如果你只测试grams这个app,记得加上--migrate参数,确保Django在测试前执行所有app的迁移:python manage.py test grams --migrate不然可能只跑了grams的迁移,没跑auth的,自然找不到
auth_user表。
按这个流程走,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者ConfusedPerson

