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:
核心原因分析
- 数据库实例不匹配:Django连接的是Docker容器内的PostgreSQL服务(通过
pgdb服务名),而pgAdmin可能连接的是服务器本地安装的PostgreSQL,两者是完全独立的数据库实例,数据自然不互通。 - 容器端口未暴露:pgdb服务未配置端口映射,外部(包括服务器本机的pgAdmin)无法直接访问容器内的PostgreSQL服务。
- 迁移未执行:部署后未运行数据库迁移,导致容器内的数据库没有创建对应的数据表。
解决方案步骤
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
相关产品推荐
相关产品推荐

