Django migrations执行成功但PostgreSQL未创建表的排查求助
Django迁移显示成功但PostgreSQL未创建表的排查方案
针对生产环境中python manage.py migrate无报错但数据库未生成对应表的问题,结合你提供的环境(Django 4.2 + PostgreSQL 15.6 + Ubuntu 22.04),可按以下步骤逐一排查:
1. 确认Django实际连接的数据库与Schema
生产环境常因环境变量、多配置文件导致连接的库并非预期目标,直接验证连接信息:
# 进入Django shell执行 python manage.py shell from django.db import connection # 查看连接的数据库名 print("当前连接数据库:", connection.settings_dict['NAME']) # 查看是否指定了自定义schema print("数据库连接OPTIONS:", connection.settings_dict.get('OPTIONS', {})) # 查询当前会话使用的schema with connection.cursor() as cursor: cursor.execute("SELECT current_schema();") print("当前生效schema:", cursor.fetchone()[0])
同时检查PostgreSQL用户的默认schema配置:
-- 登录PostgreSQL执行,设置用户默认schema ALTER ROLE 你的数据库用户 IN DATABASE 目标库名 SET search_path TO 你的目标schema, public;
2. 检查Django迁移记录是否异常
Django通过django_migrations表标记迁移状态,若该表错误记录了已执行状态,会导致migrate跳过实际执行:
-- 登录PostgreSQL查询目标app的迁移记录 SELECT app, name, applied FROM django_migrations WHERE app = '你的app名称';
对比本地迁移状态:
python manage.py showmigrations 你的app名称
若生产显示迁移已应用但实际无表,可重置迁移标记(谨慎操作,会清除现有迁移记录):
# 重置指定app的迁移标记为未执行 python manage.py migrate 你的app名称 zero --fake # 重新执行迁移 python manage.py migrate 你的app名称
3. 开启PostgreSQL详细日志追踪SQL执行
隐式事务回滚可能不会被Django捕获,开启PostgreSQL全量日志查看真实执行情况:
- 编辑PostgreSQL配置文件(通常路径为
/etc/postgresql/15/main/postgresql.conf):log_statement = 'all' # 记录所有SQL语句 log_min_messages = debug1 # 记录调试级别的日志 log_directory = '/var/log/postgresql' - 重启PostgreSQL服务:
sudo systemctl restart postgresql - 再次执行
python manage.py migrate,查看日志文件(如/var/log/postgresql/postgresql-15-main.log),确认是否有建表SQL语句,以及是否出现ROLLBACK操作。
4. 验证生产环境的配置文件加载
确保migrate命令使用的是生产环境配置:
# 指定生产配置文件执行migrate python manage.py migrate --settings=你的项目名.settings_production
检查是否有环境变量覆盖了数据库配置:
echo $DATABASE_URL
5. 检查Schema权限
即使用户有数据库权限,也可能缺少目标Schema的操作权限:
-- 授予用户目标Schema的使用和建表权限 GRANT USAGE, CREATE ON SCHEMA 你的目标schema TO 你的数据库用户;
6. 排查迁移文件本身问题
- 对比本地与生产的迁移文件内容,确认是否有缺失或不一致(比如新迁移未部署到生产);
- 执行
python manage.py makemigrations --check,检查是否有未生成的迁移或文件冲突; - 查看迁移文件中是否有自定义逻辑(如
RunSQL、条件判断)导致生产环境未执行建表操作。
7. 查看migrate的详细执行日志
通过高 verbosity 级别查看Django迁移的完整流程:
python manage.py migrate --verbosity 3
重点关注是否有"Applying xxx... OK"的输出,若没有则说明Django认为该迁移已完成,无需执行。
内容的提问来源于stack exchange,提问作者true_ostik
相关产品推荐
相关产品推荐

