本地通过Python连接Heroku Postgres数据库失败该如何解决?
问题根源
- 你执行的
set DATABASE_URL=postgres://$(whoami)是Unix系shell(Bash/Zsh等)的语法,$(whoami)属于命令替换表达式,Windows的cmd/PowerShell默认不支持该语法,所以会把$(whoami)直接作为字符串赋值给环境变量,导致连接数据库时无法解析主机名。 - 官方教程里的本地环境变量配置示例默认针对Unix开发环境,且该配置是用于连接本地安装的PostgreSQL实例,不是直接连接Heroku云端的Postgres数据库。Heroku线上的
DATABASE_URL是平台自动注入的,和本地手动配置的没有关系,线上运行正常就是因为平台自动填充了有效的地址值。
修复方案
方案1:本地直接连接Heroku云端Postgres(无需本地安装数据库)
你可以通过Heroku CLI自动拉取最新的数据库凭证,不需要手动复制后台的地址:
- 首先确保你已经登录Heroku CLI,且当前目录关联了你的Heroku应用
- 启动本地服务前先执行命令拉取最新的
DATABASE_URL:- Unix系系统(Mac/Linux):
export DATABASE_URL=$(heroku config:get DATABASE_URL -a 你的Heroku应用名) - Windows cmd:
for /f "delims=" %a in ('heroku config:get DATABASE_URL -a 你的Heroku应用名') do set DATABASE_URL=%a - Windows PowerShell:
$env:DATABASE_URL = heroku config:get DATABASE_URL -a 你的Heroku应用名
- Unix系系统(Mac/Linux):
- 再执行
heroku local启动即可,每次启动前执行上述命令就能自动获取最新的凭证,不需要手动复制。
方案2:本地使用自己安装的PostgreSQL实例
如果你要在本地开发用本地数据库,只需要按照你本地PostgreSQL的配置修改环境变量即可:
- 把
DATABASE_URL的值替换为你本地PostgreSQL的连接地址,格式为postgres://本地数据库用户名:本地数据库密码@localhost:5432/本地数据库名 - 本地连接不需要加
sslmode='require',你可以加个环境判断优化代码兼容性:
import os import psycopg2 DATABASE_URL = os.environ['DATABASE_URL'] # 本地开发用本地数据库时关闭ssl,云端环境自动保留ssl配置 if 'localhost' in DATABASE_URL or '127.0.0.1' in DATABASE_URL: connection = psycopg2.connect(DATABASE_URL) else: connection = psycopg2.connect(DATABASE_URL, sslmode='require') cursor = connection.cursor()
内容的提问来源于stack exchange,提问作者kxrxkt
相关产品推荐
相关产品推荐

