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

Docker-Compose+Django+PostgreSQL迁移数据不入库问题求助

问题排查与解决方案:Docker+Django+PostgreSQL 迁移后数据库无数据

可能的问题点及解决步骤

1. 数据库服务未完全就绪就执行迁移

depends_on仅保证容器启动顺序,无法确保PostgreSQL服务完全就绪。web容器可能在数据库还没准备好时就执行迁移,导致迁移静默失败。

解决方法:
在web服务的启动命令中添加等待数据库就绪的逻辑,修改docker-compose.yml的web.command:

command: >
  sh -c "until pg_isready -h ${POSTGRES_HOST} -p ${POSTGRES_PORT}; do sleep 2; done;
         python manage.py makemigrations &&
         python manage.py migrate &&
         python manage.py runserver 0.0.0.0:8000"

同时需要在Dockerfile中安装PostgreSQL客户端工具,否则pg_isready命令不存在:

FROM python:3.8

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code

# 安装postgresql客户端工具
RUN apt-get update && apt-get install -y postgresql-client && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

2. 环境变量配置冗余或错误

PostgreSQL官方镜像仅识别POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORD三个环境变量,db服务中的其他变量可以删除,避免混淆。修改docker-compose.yml的db.environment:

environment:
  - POSTGRES_DB=${POSTGRES_DB}
  - POSTGRES_USER=${POSTGRES_USER}
  - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

同时检查你的.env文件:

  • POSTGRES_ENGINE必须为django.db.backends.postgresql或django.db.backends.postgresql_psycopg2(根据Django版本选择)
  • POSTGRES_HOST必须为db(Docker Compose中服务名即容器主机名)
  • POSTGRES_PORT保持默认的5432

3. 迁移命令未实际执行或执行失败

查看web容器的日志,确认迁移是否成功:

docker-compose logs web

如果日志显示"No migrations to apply"但你有模型变更,可手动进入web容器重新执行迁移:

docker-compose exec web python manage.py makemigrations
docker-compose exec web python manage.py migrate

观察输出是否有错误提示。

4. 数据库连接或挂载异常

进入db容器,直接检查数据库状态:

docker-compose exec db psql -U ${POSTGRES_USER} -d ${POSTGRES_DB}
# 执行SQL查看表是否存在
\dt

如果没有任何表,说明迁移未执行成功;如果有表但无数据,问题出在数据写入逻辑(如未调用save()、事务未提交等)。

5. Django代码层面的事务问题

检查你的业务代码:

  • 确认模型实例创建后调用了instance.save()
  • 如果使用transaction.atomic(),排查是否有异常导致事务回滚
  • 查看Django日志是否存在事务回滚的相关信息

验证流程

  1. 停止并重置容器与数据卷:docker-compose down -v
  2. 重新构建并启动服务:docker-compose up --build
  3. 查看web容器日志,确认迁移命令成功执行
  4. 进入db容器,用psql验证表是否生成
  5. 通过Django admin或测试视图写入数据,再次验证数据库中是否存在数据

内容的提问来源于stack exchange,提问作者Ivan Campelo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:50:29