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

Django项目部署后PostgreSQL数据无法在pgAdmin显示问题

Django+PostgreSQL部署后pgAdmin无法看到录入数据的排查与解决

问题现象

  • 本地开发时,pgAdmin可正常查看PostgreSQL数据库中的数据
  • 服务器部署后,pgAdmin能通过服务器IP成功连接数据库,但无法看到系统录入的数据

现有配置

Django settings.py 数据库配置

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'xxxx',
    'USER' : 'xxx',
    'PASSWORD': 'xxx',
    'HOST': 'pgdb',
    'PORT': 5432,
}
}

docker-compose.yaml 配置

services:
# CaddyServer reverse proxy
caddy:
    restart: always
    image: caddy:2-alpine
    ports:
        - "443:443"
    command: caddy reverse-proxy --from https://xxxxxx.com --to http://0.0.0.0:8000
    #volumes:
    #    - /local/path/to/Caddyfile:/path/inside/continer/to/Caddyfile
    #     networks:
    #   - web
    #   - bridge

# Django web app
django:
    restart: always
    build: .
    ports:
      - "80:8000"
    depends_on:
      - pgdb
    #environment:
    #    - url=https://api.backend.example.com
    #command: "gunicorn config.wsgi:application --bind 0.0.0.0:8000"
    #networks:
    #   - bridge
pgdb:
    image: postgres
    container_name: pgdb
    environment:
      - POSTGRES_DB=xxxx
      - POSTGRES_USER=xxxx
      - POSTGRES_PASSWORD=xxxx
    volumes: 
      - pg-data:/var/lib/postgresql/data/

volumes:
pg-data:

核心原因分析

  1. 数据库实例不匹配:Django连接的是Docker容器内的PostgreSQL服务(通过pgdb服务名),而pgAdmin可能连接的是服务器本地安装的PostgreSQL,两者是完全独立的数据库实例,数据自然不互通。
  2. 容器端口未暴露:pgdb服务未配置端口映射,外部(包括服务器本机的pgAdmin)无法直接访问容器内的PostgreSQL服务。
  3. 迁移未执行:部署后未运行数据库迁移,导致容器内的数据库没有创建对应的数据表。

解决方案步骤

1. 暴露pgdb容器端口,让pgAdmin能连接到容器内的数据库

修改docker-compose.yaml中pgdb服务的配置,添加端口映射:

pgdb:
    image: postgres
    container_name: pgdb
    environment:
      - POSTGRES_DB=xxxx
      - POSTGRES_USER=xxxx
      - POSTGRES_PASSWORD=xxxx
    volumes: 
      - pg-data:/var/lib/postgresql/data/
    ports:
      - "5432:5432"  # 将容器5432端口映射到服务器主机5432端口

执行命令重启容器:

docker-compose down && docker-compose up -d

2. 验证pgAdmin连接的是容器内的数据库

在pgAdmin中创建新连接时,确保:

  • 主机地址为服务器公网/内网IP
  • 端口为5432(或你修改后的端口)
  • 用户名、密码、数据库名与docker-compose.yaml中pgdb的环境变量完全一致

3. 确认Django已写入数据到容器数据库

进入Django容器,通过Django Shell验证数据存在:

# 查看Django容器名称
docker ps | grep django

# 进入容器
docker exec -it <django-container-name> bash

# 启动Django Shell
python manage.py shell

# 查询数据(替换为你的Model)
from your_app.models import YourModel
print(YourModel.objects.all())

如果此处能查询到数据,说明Django已正常写入容器数据库,问题出在pgAdmin的连接目标。

4. 检查服务器本地PostgreSQL(可选)

如果服务器本地安装了PostgreSQL,会占用5432端口,导致pgdb端口映射失败或pgAdmin默认连接本地数据库:

# 检查本地PostgreSQL状态
systemctl status postgresql

# 查看5432端口占用情况
lsof -i :5432

若本地PostgreSQL在运行,可选择:

  • 停止本地PostgreSQL服务:systemctl stop postgresql && systemctl disable postgresql
  • 修改pgdb的端口映射为其他端口,比如"5433:5432",pgAdmin连接时使用服务器IP的5433端口

5. 执行数据库迁移(必做)

进入Django容器,运行迁移命令确保数据表已创建:

docker exec -it <django-container-name> python manage.py migrate

内容的提问来源于stack exchange,提问作者Furkan Yıldız

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:05:21