如何在 Heroku 的 Rails 控制台内切换数据库?
How can I switch database inside a Rails console on Heroku?
我正在尝试将用户从一个系统迁移到另一个系统。每个系统都有自己的数据库和不同的类.
我的计划是连接到一个数据库,通过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"?
但是,我可以通过使用 DATABASE_URL 作为环境变量在 heroku 上启动我的 rails 控制台来连接到这个旧数据库:
$ heroku run 'DATABASE_URL=postgres://...info... rails console' -a console' -a app
但我不知道如何切换回我的新数据库以便更新内容。
在 heroku 上使用 rails 控制台时如何在 运行 时间切换数据库?
为什么要尝试运行时切换数据库?为什么不同时连接两者并在模型级别指定它们 read/write 来自哪个数据库? Rails 支持连接多个数据库并在各个模型中指定要使用的数据库连接:https://guides.rubyonrails.org/active_record_multiple_databases.html
问题是使用 url:
不起作用,需要指定所有参数。
config = {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>10, "username"=>"u...", "password"=>"p...", "port"=>5432, "database"=>"d...", "host"=>"ec2..."}
如果你想要一个 3 层数据库 yml,你可以使用这个:
config = ActiveRecord::Base.configurations["production"]["seconddb"]
然后,您可以使用establish_connection
ActiveRecord::Base.establish_connection(config)
ActiveRecord::Base.connection.execute("select count(*) from users")
一旦我开始指定用户名、密码、端口、数据库和主机,一切都非常顺利。
要同时使用两个数据库,一个好方法是创建一个 class
class OtherDB < ActiveRecord::Base
establish_connection(ActiveRecord::Base.configurations["production"]["seconddb"])
end
然后你就可以这样调用了
OtherDB.table_name = "table_name"
OtherDB.first
ref (Establish a connection to another database only in a block?)
然后 运行 SQL 命令:
OtherDB.connection.execute("select count(*) from users")
我正在尝试将用户从一个系统迁移到另一个系统。每个系统都有自己的数据库和不同的类.
我的计划是连接到一个数据库,通过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"?
但是,我可以通过使用 DATABASE_URL 作为环境变量在 heroku 上启动我的 rails 控制台来连接到这个旧数据库:
$ heroku run 'DATABASE_URL=postgres://...info... rails console' -a console' -a app
但我不知道如何切换回我的新数据库以便更新内容。
在 heroku 上使用 rails 控制台时如何在 运行 时间切换数据库?
为什么要尝试运行时切换数据库?为什么不同时连接两者并在模型级别指定它们 read/write 来自哪个数据库? Rails 支持连接多个数据库并在各个模型中指定要使用的数据库连接:https://guides.rubyonrails.org/active_record_multiple_databases.html
问题是使用 url:
不起作用,需要指定所有参数。
config = {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>10, "username"=>"u...", "password"=>"p...", "port"=>5432, "database"=>"d...", "host"=>"ec2..."}
如果你想要一个 3 层数据库 yml,你可以使用这个:
config = ActiveRecord::Base.configurations["production"]["seconddb"]
然后,您可以使用establish_connection
ActiveRecord::Base.establish_connection(config)
ActiveRecord::Base.connection.execute("select count(*) from users")
一旦我开始指定用户名、密码、端口、数据库和主机,一切都非常顺利。
要同时使用两个数据库,一个好方法是创建一个 class
class OtherDB < ActiveRecord::Base
establish_connection(ActiveRecord::Base.configurations["production"]["seconddb"])
end
然后你就可以这样调用了
OtherDB.table_name = "table_name"
OtherDB.first
ref (Establish a connection to another database only in a block?)
然后 运行 SQL 命令:
OtherDB.connection.execute("select count(*) from users")