【问题标题】:How can I switch database inside a Rails console on Heroku?如何在 Heroku 的 Rails 控制台内切换数据库?
【发布时间】:2020-03-08 07:48:51
【问题描述】:

我正在尝试将用户从一个系统迁移到另一个系统。每个系统都有自己的数据库和不同的类。

我的计划是连接一个数据库,通过 SQL 命令从一个数据库中读取一些信息:

ActiveRecord::Base.connection.execute(sql_command)

对数据做一些事情,然后使用普通模型将一些结果写入新数据库。

我计划在 Sidekiq 工作中执行此操作,但我正在尝试使用 Heroku 上的 Rails 控制台进行一些测试。

这应该很简单,但事实证明这非常困难。

当我在 Heroku 上启动 Rails 控制台时。我正在连接到 DATABASE_URL,这没问题,但是当我尝试连接到旧数据库并执行命令时,如下所示:

ActiveRecord::Base.establish_connection(adapter: "postgresql", encoding: "unicode", pool: 10, url: "postgres://...info...")
ActiveRecord::Base.connection.execute("select count(*) from users")

我最终得到:

PG::ConnectionBad (could not connect to server: No such file or directory)
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

但是,我可以通过在 heroku 上使用 DATABASE_URL 作为 env 变量启动我的 rails 控制台来连接到这个旧数据库:

$ heroku run 'DATABASE_URL=postgres://...info... rails console' -a  console' -a app

但是我不知道如何切换回我的新数据库以便更新内容。

在heroku上使用rails控制台时如何在运行时切换数据库?

【问题讨论】:

  • 你试过@jvergeldedios 的答案吗? 1. 使用rails可以设置多个数据库。按照活动记录说明进行操作。 2. 确保您已将旧数据库附加到您的 heroku 应用程序。它应该有另一个标记名称为 DATABASE_URL。 Heroku 在您附加它时会自动执行此操作。附加后,您的应用能够建立连接。
  • @SimonFranzen 谢谢,从 2 层更改为 3 层并在此处指定第二个数据库链接,但不知道如何对第二个数据库运行查询。另外,我不确定您所说的“将旧数据库附加到应用程序”是什么意思。你的意思是在database.yml中指定它吗?第二个数据库被另一个应用程序使用。
  • 您可以在 heroku 中将资源(如数据库)从一个应用程序附加到另一个应用程序。只是意味着,数据库可以在 Heroku 上的两个应用程序或多个应用程序中访问。您可以访问具有活动记录的其他数据库。您可以在模型中定义它应该使用哪个数据库。或者您编写原始 SQL 语句,在这里您可以看到如何切换 dbs -> guides.rubyonrails.org/…

标签: ruby-on-rails heroku activerecord sidekiq


【解决方案1】:

问题是使用url: 不起作用,需要指定所有参数。

config = {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>10, "username"=>"u...", "password"=>"p...", "port"=>5432, "database"=>"d...", "host"=>"ec2..."}

如果你使用 3tier 数据库 yml,你可以使用这个:

config = ActiveRecord::Base.configurations["production"]["seconddb"]

然后,你可以使用establish_connection

ActiveRecord::Base.establish_connection(config)
ActiveRecord::Base.connection.execute("select count(*) from users")

一旦我开始指定用户名、密码、端口、数据库和主机,这一切就像一个魅力。

要同时使用两个数据库,一个好方法是创建一个类

class OtherDB < ActiveRecord::Base
  establish_connection(ActiveRecord::Base.configurations["production"]["seconddb"])
end

那你就可以这样称呼了

OtherDB.table_name = "table_name"
OtherDB.first

参考 (Establish a connection to another database only in a block?)

并运行 SQL 命令:

OtherDB.connection.execute("select count(*) from users")

【讨论】:

    【解决方案2】:

    为什么要尝试运行时切换数据库?为什么不同时连接两者并在模型级别指定它们从哪个数据库读取/写入? Rails 支持连接多个数据库并在单个模型中指定要使用的数据库连接:https://guides.rubyonrails.org/active_record_multiple_databases.html

    【讨论】:

    • 我不确定这是否适用于 Heroku,但我会试一试。该文档适用于边缘,我在 Rails 5.2 上运行,ActiveRecord::Base:Class 的“connected_to”不存在。那么如何对第二个数据库运行 SQL 查询呢?我从 2 层改为 3 层。校准第二个数据库:legacy
    • @Jeremy 多数据库支持是 Rails 的新功能,它是 Rails 6 的最佳新功能之一。
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2011-07-21
    • 2011-12-05
    • 1970-01-01
    • 2014-06-17
    • 2011-12-27
    相关资源
    最近更新 更多