【问题标题】:Ruby Sinatra/Postgres - can't connect to heroku database with PG.connect?Ruby Sinatra/Postgres - 无法使用 PG.connect 连接到 heroku 数据库?
【发布时间】:2015-08-14 01:10:55
【问题描述】:

我正在尝试使用 Sinatra 和 PostgreSQL 在 Heroku 上建立一个站点。它在本地工作(连接到本地数据库),但在将其推送到 Heroku 并更改我的 PG.connect 以反映这一点后,当页面尝试访问数据库时,我得到 Internal Server Error

require 'uri'
require 'pg'

uri = URI.parse(ENV['DATABASE_URL'])

def db(uri)
  begin
    connection = PG.connect(uri.hostname, uri.port, nil, nil, uri.path[1..-1], uri.user, uri.password)
    yield(connection)
  ensure
    connection.close
  end
end

我很确定这些解析正确,因为ENV['DATABASE_URL'] 显示了我所期望的完整的postgres://user:password@host:port/database 信息,如果我在 IRB uri.hostname、ui.port 等中执行相同操作,都会返回预期的内容.

这是我第一次尝试让网站在 Heroku 上运行,所以我什至不知道如何解决这个问题。 (昨天我用谷歌搜索了大约所有内容。)

heroku pg 的结果:

=== DATABASE_URL
Plan:        Hobby-dev
Status:      Available
Connections: 0/20
PG Version:  9.4.2
Created:     2015-05-30 19:24 UTC
Data Size:   17.7 MB
Tables:      5
Rows:        9320/10000 (In compliance, close to row limit)
Fork/Follow: Unsupported
Rollback:    Unsupported

当我从 cli 执行 heroku pg:psql <database> 时,所有表格都会显示。

我看到的一些答案说要将database.yml添加到我的根应用程序目录中,所以:

production:
  adapter: 'postgresql'
  database: '<database>'
  host: ENV['DATABASE_URL']
  username: '<username>'

我可能遗漏了一些简单的东西,但我还没有看到关于 Heroku 的 Sinatra/PSQL 的完整指南 - 没有专门针对设置和连接到数据库的内容。 (一切似乎都与 Rails 相关。)

【问题讨论】:

  • 你的日志怎么说?
  • 不知道为什么我没有收到回复的电子邮件警报...日志只是说“nil 类没有方法'close'”,所以PG.connect 没有找到数据库并返回 nil
  • 如果无法连接,PG.connect 不应该引发错误吗?
  • 我是这么认为的。在本地测试它,如果我提供一个不存在的数据库,它会引发PG::ConnectionBad 错误。如果我提供零个参数或nil,它会返回一个PG::Connection 对象,它可以是.closed。所以我真的不确定它是如何到达close 而不事先给出错误或返回连接对象

标签: ruby postgresql heroku sinatra


【解决方案1】:

在您的database.yml 文件中,您需要为host 条目指定正确的主机。您正在传递存储在DATABASE_URL(类似于postgres://user:password@host:port/database)中的内容,但它应该只是主机。

如果端口不是 PostgreSQL 的默认端口,您还需要指定端口。

编辑:还应该指出如果您打算将主机(或其他任何东西 - 您绝对应该用于用户名和密码)存储在您需要包装它的环境变量中,例如&lt;%= ENV['HOST'] %&gt;,不仅仅是ENV['HOST'](即你在上面的database.yml摘录中的内容)

【讨论】:

  • 嗯,好吧,第一部分是有道理的——我忽略了我传递的是完整的 URL 而不仅仅是主机部分。如果我用 填充 database.yml,其他的会是什么? “端口”、“用户名”、“密码”等?一般来说,我也对 database.yml 感到非常困惑——我认为我的 db 中的 PG.connect 将是唯一负责连接到数据库的东西。我看过很多不同的教程和帖子,有些只是使用 PG gem,有些使用 database.yml,有些是通过 config.ru 传递东西...
  • HOST 没有环境变量 - 您需要将其设置为以及您不想硬编码到文件中的任何其他人。如果您不熟悉一般环境变量或不熟悉 Heroku 上的使用,我建议您阅读他们的 guide - 但基本上您会执行类似 heroku config:set HOST=myhost.com 的操作,然后在您的 database.yml 文件中使用 &lt;%= ENV['HOST'] %&gt;
  • 不知何故,我读到的任何内容都没有提到设置这些环境变量,谢谢.. 我已经设置好了,我知道我的应用可以访问它们(我让它们在根视图上短暂呈现),我修复了我的 database.yml 和 PG.connect 调用以使用它们,而不是从 URI 解析它们...仍然是相同的结果 - 调用 .connect 返回 nil
  • 您可能会发现这个tutorial 很有用。此外,如果您对当前项目还没有走得太远并且对 Sinatra 不太感激,您可能需要考虑使用Rails,它带有一个开箱即用的 ORM (ActiveRecord),这将大大简化访问数据库(即您不需要管理连接)。
  • 不错的链接,谢谢! Sinatra 对学习 Rails 一直“隐藏”的许多基础知识(对我们新手来说)非常有用,但是.. 不,我不是很感激它——我真的只是希望能在网上获得一个演示应用程序,但我想我会等到我们进入 Sinatra 和 Rails 的 ActiveRecord。感谢您的帮助!
猜你喜欢
  • 2013-04-21
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2018-07-12
  • 2017-02-24
  • 2014-05-07
相关资源
最近更新 更多