【问题标题】:Is it possible to directly connect to a Heroku database from localhost?是否可以从 localhost 直接连接到 Heroku 数据库?
【发布时间】:2012-07-27 09:59:24
【问题描述】:

如果我有一个 DATABASE_URL,是否可以从 localhost 连接到它?我正在使用以下代码:

db = URI.parse(database_url)
connection = ActiveRecord::Base.establish_connection(
                                                     :adapter  => db.scheme == 'postgres' ? 'postgresql' : db.scheme,
                                                     :host     => db.host,
                                                     :username => db.user,
                                                     :password => db.password,
                                                     :database => db.path[1..-1],
                                                     :encoding => 'utf8'
                                                     )

在我的电脑上运行代码时,我不断收到如下错误:

could not connect to server: Connection timed out
Is the server running on host some_host.amazonaws.com and accepting
    TCP/IP connections on port 5432?

我正在使用相同的代码在 Heroku 上运行的两个应用程序之间共享一个数据库,并且它可以正常工作。这让我相信连接到 Heroku 数据库是受限制的,除非你从 Heroku 主机执行它。这是真的吗?

【问题讨论】:

    标签: ruby-on-rails database heroku


    【解决方案1】:

    外部连接确实需要 SSL。可以通过sslmode=require 参数强制底层 postgres 适配器使用 SSL。您可以从 ActiveRecord 连接选项向下传递任意参数,如下所示:

    ActiveRecord::Base.establish_connection(
      adapter:  'postgresql', 
      host:     'host', 
      username: 'user', 
      password: 'pass', 
      database: 'database_name', 
      encoding: 'utf-8',
      port:     '5432', # could be a non-standard port
      sslmode:  'require' # force SSL
    )
    

    我已经在本地验证了这一点,这里有一个完整的会话显示它有效。请确保您没有输入错误:

    heroku pg:credentials yellow -a my-app                                                               Connection info string:
       "dbname=ddbolrs4g89dsi host=ec2-23-21-91-108.compute-1.amazonaws.com port=5432 user=itkdrxzjmwcjtw password=wU-4tT3YbF8AZ3U5kwu-2KYPEX ssl
    mode=require"
    $ irb
    > require 'active_record'
     => true
    > ActiveRecord::Base.establish_connection(adapter: 'postgresql', database: 'ddbolrs4g89dsi', host: 'ec2-23-21-91-108.compute-1.amazonaws.com', username: 'itkdrxzjmwcjtw', password: 'wU-4tT3YbF8AZ3U5kwu-2KYPEX', sslmodel: 'require')
     => #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x007f7f9ba6f0f0 @mon_owner=nil, @mon_count=0, @mon_mutex=#<Mutex:0x007f7f9ba6f078>, @spec=#<ActiveRecord::Base::ConnectionSpecification:0x007f7f9ba64150 @config={:adapter=>"postgresql", :database=>"ddbolrs4g89dsi", :host=>"ec2-23-21-91-108.compute-1.amazonaws.com", :username=>"itkdrxzjmwcjtw", :password=>"wU-4tT3YbF8AZ3U5kwu-2KYPEX", :sslmodel=>"require"}, @adapter_method="postgresql_connection">, @reserved_connections={}, @queue=#<MonitorMixin::ConditionVariable:0x007f7f9ba6f000 @monitor=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x007f7f9ba6f0f0 ...>, @cond=#<ConditionVariable:0x007f7f9ba6efd8 @waiters=[], @waiters_mutex=#<Mutex:0x007f7f9ba6ef88>>>, @timeout=5, @size=5, @connections=[], @automatic_reconnect=true>
    > ActiveRecord::Base.connection.execute("SELECT version()").first
     => {"version"=>"PostgreSQL 9.1.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, 64-bit"} 
    > exit
    $ # remove db, leaked creds ^
    $ heroku addons:remove HEROKU_POSTGRESQL_YELLOW -a my-app --confirm my-app 
    Removing HEROKU_POSTGRESQL_YELLOW on my-app... done, v490 (free)
    

    【讨论】:

    • 我不断收到相同的错误消息,即使我将sslmode 传递给连接。
    • 添加了一个完整的例子。将您的应用名称私信给我或打开支持票,我可以进一步调查。你能从 Heroku 中连接到这个数据库吗?如果您尝试使用全新的dev 数据库会怎样?
    • 我的问题是我的 heroku 数据库在端口 5472 上运行。我也调整了代码以使用端口,也许调整你的 sn-p 会很好?感谢您的大力支持!
    • 虽然我在非共享数据库上取得了成功,但此解决方案似乎不适用于共享数据库。您能否在免费数据库上尝试您的方法,看看是否取得了一些成功?
    • @Tempus,这仅适用于新的计划阵容。旧的共享数据库计划不支持入口。话虽如此,请尽快迁移到开发或基本计划,因为共享数据库产品即将被弃用。见devcenter.heroku.com/articles/…
    【解决方案2】:

    到 postgresql 服务器的外部连接需要 Heroku 上的 SSL。也请查看docs

    【讨论】:

    • 有什么想法可以将它集成到establish_connection中吗?
    • 似乎postgresql gem 有一种方法:fftools.blogspot.de/2012/03/… 不知道它是否也适用于 Heroku gem 建议的 pg
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 2021-12-02
    • 2015-03-19
    • 2020-09-02
    • 1970-01-01
    • 2021-09-20
    • 2012-04-03
    • 2020-12-16
    相关资源
    最近更新 更多