【问题标题】:Connecting to multiple databases using ActiveRecord使用 ActiveRecord 连接到多个数据库
【发布时间】:2014-07-04 17:53:12
【问题描述】:

我的应用需要根据请求连接到数据库。数据库的数据模型是相同的,但我需要并行连接到不同的数据库。例如,我的 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 上运行此代码。

谢谢。 - 最大

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

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

    对于这种情况,只使用MySQL2 gem 效果很好。这种方法允许 Rails 对应用程序中的某些内容持意见(我想要/需要 ORM),但当我真的只需要连接到任意数据库以获取一些快速数据时,它让我可以灵活地避免 AR。

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

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

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

    HTH

    【讨论】:

    • 我只会从数据库中读取数据,但使用活动记录为您提供的一些关系功能可能会很方便,因为数据是高度相关的。此外,您还可以获得我需要的免费 JSON 序列化。一旦我开始实施这些东西,我将在明天发布更新。感谢您的出色回答。
    【解决方案2】:

    在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多