Django+PostgreSQL+Docker环境下如何访问数据库查看修改表
方法一:终端访问
方式1:容器内直接调用psql(无需额外配置,推荐)
确保compose服务处于运行状态,在存放docker-compose.yml的项目根目录执行命令:
docker compose exec db psql -U postgres -d postgres
命令参数完全匹配你配置的数据库账号、库名,执行后直接进入psql交互界面,无需额外输入密码
进入psql后常用操作:
- 查看当前库下所有数据表:
\dt - 查看指定表结构:
\d 表名(例如查看Django默认用户表用\d auth_user) - 数据查询、修改、插入、删除:直接执行标准SQL语句即可,语句末尾必须加分号
- 退出psql交互:输入
\q后回车
方式2:本地psql客户端连接
如果要使用宿主机安装的psql客户端连接,需要先给db服务添加端口映射,修改docker-compose.yml中db段配置,新增ports配置:
services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data ports: - "5432:5432" # 新增该行,将容器5432端口映射到宿主机 environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres
修改完成后执行docker compose up -d db重启数据库服务,之后在本地终端执行:
psql -h 127.0.0.1 -U postgres -d postgres
根据提示输入密码postgres即可连接,操作语法和容器内psql完全一致。
补充:通过Django ORM操作数据
如果只需要操作Django模型映射的表,不需要写原生SQL,可以直接进入web服务容器调用Django shell:
docker compose exec web python manage.py shell
进入交互环境后即可导入模型执行ORM操作,例如查询所有超级用户:
from django.contrib.auth.models import User User.objects.filter(is_superuser=True)
方法二:pgAdmin可视化访问
方式1:容器部署pgAdmin(无需本地安装)
在docker-compose.yml中追加pgAdmin服务配置:
pgadmin: image: dpage/pgadmin4 restart: always environment: - PGADMIN_DEFAULT_EMAIL=admin@example.com # 登录pgAdmin用的账号 - PGADMIN_DEFAULT_PASSWORD=admin123 # 登录pgAdmin用的密码 ports: - "5050:80" depends_on: - db
执行docker compose up -d pgadmin启动服务,之后打开浏览器访问http://localhost:5050,用刚才配置的邮箱、密码登录。
登录后新建服务器连接,连接参数如下:
- 主机名/地址:
db(同docker网络内直接用服务名解析) - 端口:
5432 - 维护数据库:
postgres - 用户名:
postgres - 密码:
postgres
保存连接后即可可视化浏览、编辑所有数据表。
方式2:本地桌面版pgAdmin连接
如果本地已经安装了pgAdmin桌面客户端,只要提前给db服务配置好5432端口映射(参考本地psql连接的配置步骤),新建连接时主机地址填127.0.0.1,其余参数和上面一致即可连接。
关于数据目录权限的说明
挂载到本地的./data/db目录所有者显示为root属于正常现象,PostgreSQL容器内部使用专用postgres用户运行服务,宿主机侧的权限映射不影响数据库正常读写,不要手动修改该目录权限,避免数据库服务启动失败。
内容的提问来源于stack exchange,提问作者almanac

