可以有多个ActiveRecord连接吗?

我正在使用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中定义新的database。

production:
  username: 
  password: 
  host: 
  database: database

db2_production:
  username: 
  password: 
  host: 
  database: database2

接下来创建一个新文件,我通常把它放在libcustomclassesdb2_database_record.rb中。

class SecondDatabaseRecord < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :"db2_#{Rails.env}"
end

确保这些文件被包含在rails应用程序的application.rb中,例如。

config.paths.add Rails.root.join('lib/customclasses').to_s, eager_load: true

然后在数据库中的模型中更新model. rb文件来查看你创建的新的自定义类。

class TableInDb2 < SecondDatabaseRecord
end

显然要把类名设置成对你有意义的东西。我有一个应用程序,它像这样与3个不同的数据库对话。

给TA打赏
共{{data.count}}人
人已打赏
未分类

在Visual Studio Code中,当箭头在圆圈中旋转时,PowerShell扩展到底在做什么?

2022-9-15 15:13:22

未分类

如何允许非root用户调用chroot(2)?

2022-9-15 15:13:24

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索