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

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全量日志查看真实执行情况:

  1. 编辑PostgreSQL配置文件(通常路径为/etc/postgresql/15/main/postgresql.conf):
    log_statement = 'all'          # 记录所有SQL语句
    log_min_messages = debug1       # 记录调试级别的日志
    log_directory = '/var/log/postgresql'
    
  2. 重启PostgreSQL服务:
    sudo systemctl restart postgresql
    
  3. 再次执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:27:11