Ruby on rails 是否可以有多个ActiveRecord连接?
我正在使用ActiveRecord和Sqlite3对大型文本文件进行一些数据挖掘,其中有许多文本文件,每个文本文件代表一个数据模型的“实例” 对于任何给定的文本文件,我解析它并最终将其加载到与ActiveRecord兼容的Sqlite3数据库中。例如,每个表都可以由ApplicationRecord的子类表示 所以我最终得到的是一堆Sqlite3数据库(文件)。我想做的是能够同时在多个“实例”上运行查询,以便可以比较“实例”之间的记录 目前我做的事情如下:Ruby on rails 是否可以有多个ActiveRecord连接?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在使用ActiveRecord和Sqlite3对大型文本文件进行一些数据挖掘,其中有许多文本文件,每个文本文件代表一个数据模型的“实例” 对于任何给定的文本文件,我解析它并最终将其加载到与ActiveRecord兼容的Sqlite3数据库中。例如,每个表都可以由ApplicationRecord的子类表示 所以我最终得到的是一堆Sqlite3数据库(文件)。我想做的是能够同时在多个“实例”上运行查询,以便可以比较“实例”之间的记录 目前我做的事情如下: data_from_db1 = n
data_from_db1 = nil
data_from_db2 = nil
ActiveRecord::Base.establish_connection(
:adapter => "sqlite3",
:database => db_1,
)
// code to extract data from the established connection
// save data to data_from_db1 object
ActiveRecord::Base.remove_connection
ActiveRecord::Base.establish_connection(
:adapter => "sqlite3",
:database => db_2,
)
// code to extract data from the established connection
// save data to data_from_db2 object
ActiveRecord::Base.remove_connection
// work with saved data_from_dbN objects
虽然这可以正常工作,但如果我能够以某种方式为每个数据库连接获取一个句柄,然后将查询直接指向特定的数据库,那就更好了
我是否可以保持多个连接处于活动状态并指定用于给定查询的连接
这似乎是不可能的,因为查询绑定到模型,我看不到指定要使用的连接的方法,甚至看不到如何获取给定连接的句柄
例如,我可以执行以下查询:
MyModel.where(....)
但我想我需要做一些事情,比如:
MyModel.with_connection(foo).where(....)
注意:在建立下一个连接之前关闭第一个连接非常重要,否则如果我请求从第一个连接检索到的模型的属性,则该属性可能实际上是ActiveRecordRelation,属性将是从当前连接而不是以前的连接返回的数据。关闭连接意味着我将引发异常,而不是获取错误的数据
轻微更新
我知道我可以将所有这些较小的数据库合并到一个较大的数据库中,但我不希望这样做,因为我可能需要对许多数据库组合进行计算,而组合数据库将是巨大的,而且过于复杂是的,我已经这样做过几次,您需要执行以下操作 在您的database.yml中定义新数据库
production:
username:
password:
host:
database: database
db2_production:
username:
password:
host:
database: database2
接下来创建一个新文件,我通常将其放在lib/customclasses/db2\u database\u record.rb中
class SecondDatabaseRecord < ActiveRecord::Base
self.abstract_class = true
establish_connection :"db2_#{Rails.env}"
end
然后,数据库中的ina模型更新model.rb文件以查看您创建的新自定义类
class TableInDb2 < SecondDatabaseRecord
end
classtableindb2
显然,将类名设置为对您有意义的名称。我有一个应用程序可以与这样的3个不同数据库进行通信。是的,有可能:
#app.rb
需要“bundler/inline”
gemfiledo
来源'https://rubygems.org'
gem‘activerecord’
gem'sqlite3'
终止
需要“活动记录”
类用户
输出:
$ruby app.rb
主表记录:
#
辅助表记录:
#
附言:
对我来说,这是一个非常有趣的问题,我必须深入到ActiveRecord测试用例中,以获得类似上面的内容
感谢elieencodes和Ryuta Kamizono努力支持活动记录上的多数据库。我从测试用例的
git
中获得名称。可能还有其他贡献者。谢谢,我将在第二天左右尝试此功能。我认为这需要rails/ActiveRecord 6,对吗?我想我还记得读过关于rails 6的多个数据库的文章,但是在阅读了详细信息之后,我认为它不适合这个用例,但我会更深入地研究。我目前没有使用rails 6,主要是因为它需要一个Sqlite3版本,而我没有在我们的环境中安装,当我尝试在本地安装它时,我遇到了一些问题。所以现在,请接受+1,当它工作时,我会接受答案。是的,它需要activerecord 6.x.x。我还没有听到任何后传。谢谢,这看起来很有趣。我不希望有多个模型类,但我不知道我可以使用类定义中的“建立连接”将模型链接到特定的数据库。我会看得更深一些。
class TableInDb2 < SecondDatabaseRecord
end