Ruby on rails 是否可以有多个ActiveRecord连接?

Ruby on rails 是否可以有多个ActiveRecord连接?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在使用ActiveRecord和Sqlite3对大型文本文件进行一些数据挖掘,其中有许多文本文件,每个文本文件代表一个数据模型的“实例” 对于任何给定的文本文件,我解析它并最终将其加载到与ActiveRecord兼容的Sqlite3数据库中。例如,每个表都可以由ApplicationRecord的子类表示 所以我最终得到的是一堆Sqlite3数据库(文件)。我想做的是能够同时在多个“实例”上运行查询,以便可以比较“实例”之间的记录 目前我做的事情如下: data_from_db1 = n

我正在使用ActiveRecord和Sqlite3对大型文本文件进行一些数据挖掘,其中有许多文本文件,每个文本文件代表一个数据模型的“实例”

对于任何给定的文本文件,我解析它并最终将其加载到与ActiveRecord兼容的Sqlite3数据库中。例如,每个表都可以由ApplicationRecord的子类表示

所以我最终得到的是一堆Sqlite3数据库(文件)。我想做的是能够同时在多个“实例”上运行查询,以便可以比较“实例”之间的记录

目前我做的事情如下:

  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