使用ActiveRecord连接到多个数据库

时间:2014-05-16 04:16:35

标签: ruby-on-rails ruby activerecord

我的情况是我的应用需要根据请求连接到数据库。数据库的数据模型是相同的,但我需要并行连接到不同的数据库。例如,我的RESTful路线可能看起来像这样

/database/:database_id/user/:user_id # Get user :user_id from database :database_id

我查看了类似的问题,他们都建议使用ActiveRecord::Base#establish_connection。然而,这些问题似乎并没有处理在使用相同模型类时同时访问多个数据库的情况。我担心的是,我将获得一个请求,建立连接,从数据库开始读取,但随后有一个新请求进来并更改ActiveRecord的连接。这是一个合理的担心吗?我使用Rails 3.0在Ruby 1.8.7上运行此代码。

感谢。 - 最大

2 个答案:

答案 0 :(得分:3)

所以,我遇到了类似的问题,连接需要有点动态。我没有使用ActiveRecord,而是建议只使用db驱动程序。在我的情况下,它是一个遗留数据库,我不需要将记录变成一个我可以操作并保存回数据库的对象,它更多用于报告目的 - 我只需要结果聚合查询(仅限选择)。

对于这种情况,只需使用MySQL2 gem即可。这种方法允许Rails对应用程序中的某些东西(我想要/需要一个ORM)有所了解,但是当我真正需要连接到任意数据库以获取一些快速数据时,我可以灵活地避免AR。 / p>

所以这里有一些你想问自己的问题:

  • 我是否需要类似ORM的功能来将数据库行映射到对象?我需要CRUD操作吗?
  • 我是否需要持久连接,或者如果数据库连接在请求后消失,它是否正常?
    • (当然,如果您需要/需要,您可以创建自己的池和持久连接)

如果您不需要与CRUD操作类似ORM的功能,并且您可以通过一些简单的操作来完成,并且如果您不需要持久连接,我建议您继续使用使用数据库驱动程序。

HTH

答案 1 :(得分:0)

在 Rails 6 中,您可以使用多数据库功能:

class ShardRecord < ActiveRecord::Base
  self.abstract_class = true

  connects_to shards: {
    club_1: { writing: :club_1, reading: :club_1 },
    club_2: { writing: :club_2, reading: :club_2 }
  }
end
class ApplicationController < ActionController::API
  before_action :set_club
  around_action :connect_to_shard

  private

  def set_club
    @club = SelectClubByDomain.new(request).slug
  end

  def connect_to_shard
    ActiveRecord::Base.connected_to(role: :writing, shard: @club.slug) do
      yield
    end
  end
end

来源:

https://guides.rubyonrails.org/active_record_multiple_databases.html https://www.freshworks.com/horizontal-sharding-in-a-multi-tenant-app-with-rails-61-blog/ https://api.rubyonrails.org/classes/ActiveRecord/ConnectionHandling.html#method-i-connected_to_many