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

在Heroku部署Rails应用时使用Ridgepole迁移Postgres数据库遇<DATABASE_URL>主机名解析失败问题求助

解决Heroku上Ridgepole无法解析Postgres主机名的问题

我来帮你一步步排查这个问题,你遇到的错误本质是ridgepole没有拿到正确的Postgres连接信息,反而把<DATABASE_URL>当成了字面主机名去解析,导致失败。下面是具体的解决步骤:

1. 确认Heroku的数据库环境变量是否有效

首先检查你的Heroku应用是否正确配置了Postgres连接信息:

heroku config:get DATABASE_URL

这个命令应该返回类似 postgres://username:password@ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:5432/dbname 的完整连接字符串。如果返回空值或格式不对,说明Heroku Postgres附加组件没正确绑定,你可以重新添加:

heroku addons:create heroku-postgresql:hobby-dev

2. 检查Rails的database.yml配置

Heroku上的Rails应用应该通过环境变量读取数据库连接,而非硬编码。确保你的config/database.yml的production部分是这样的:

production:
  url: <%= ENV['DATABASE_URL'] %>
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

如果配置里写死了<DATABASE_URL>或没正确引用环境变量,ridgepole就会读取到错误的主机名。

3. 调整Ridgepole的执行命令

直接用--url参数传递正确的数据库连接URL,绕开database.yml的解析问题:

heroku run bundle exec ridgepole --url $(heroku config:get DATABASE_URL) -f db/Schemafile --apply

这样ridgepole会直接使用Heroku提供的有效连接字符串,不会去解析<DATABASE_URL>这个无效主机名。

4. 正确使用pg_isready测试连接

你之前用pg_isready -h <DATABASE_URL>是错误的——<DATABASE_URL>是完整连接字符串,不是单纯的主机名。正确做法是:

  1. 运行heroku config:get DATABASE_URL拿到完整字符串
  2. 从中提取主机(比如ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com)和端口(通常是5432)
  3. 执行测试命令:
pg_isready -h 提取的主机名 -p 5432

这样才能正确测试Postgres主机的连通性。

5. 确认Postgres附加组件状态

最后检查Heroku Postgres是否正常运行:

heroku addons:info heroku-postgresql

确保状态是available,如果有异常,可以尝试重启数据库:

heroku pg:restart

内容的提问来源于stack exchange,提问作者chunli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:02:32