DigitalOcean托管PostgreSQL数据库创建后无法连接求助
解决DigitalOcean托管Postgres连接池切换数据库失败及SSL问题
问题根源分析
- 事务级连接池限制:DigitalOcean默认推荐的连接池是事务级,这类连接池会复用数据库连接,且每个连接固定绑定到初始连接的数据库,不支持
\c切换数据库操作——这就是你创建数据库后却提示no such database的核心原因。 - SSL参数未继承:
\c命令不会自动继承初始连接的SSL配置,切换时如果未显式指定SSL参数,就会触发SSL required错误。
分步解决方案
1. 直接连接目标数据库(推荐)
放弃先连初始库再切换的方式,直接用完整连接字符串指定新数据库:
psql "host=[连接池VPC地址] port=25061 dbname=new_database_name user=doadmin password=[你的密码] sslmode=require"
2. 若需切换数据库,修改连接池模式
如果必须通过\c切换数据库,需将连接池改为会话级(注意:会话级连接池性能低于事务级,适合长连接场景):
- 登录DigitalOcean控制台,进入数据库集群的「连接池」页面
- 找到目标连接池,修改「连接模式」为「会话级」
- 重启连接池后,即可使用
\c new_database_name切换(仍需确保SSL配置)
3. 解决SSL required错误
- 切换数据库时显式携带SSL参数:
\c "dbname=new_database_name host=[连接池VPC地址] port=25061 user=doadmin password=[你的密码] sslmode=require" - 或者在Droplet的
~/.psqlrc中添加默认SSL配置,避免每次手动指定:echo '\set sslmode require' >> ~/.psqlrc
4. 确保Django应用正常连接
在Django的settings.py中配置完整的数据库参数,强制启用SSL:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'new_database_name', 'USER': 'doadmin', 'PASSWORD': '你的数据库密码', 'HOST': '连接池VPC地址', 'PORT': '25061', 'OPTIONS': { 'sslmode': 'require', }, } }
5. 验证UFW规则
确认Droplet的UFW允许VPC内的25061端口出站流量:
# 替换为你的数据库集群VPC网段 ufw allow out to 10.x.x.x/24 port 25061 proto tcp
验证步骤
- 用完整连接字符串直接连接新数据库,确认能成功进入psql提示符
- 运行Django命令验证连接:
若能进入新数据库的psql环境,说明配置正常;也可执行python manage.py dbshellpython manage.py migrate测试数据迁移是否正常。
内容的提问来源于stack exchange,提问作者Tuffgong
相关产品推荐
相关产品推荐

