You need to enable JavaScript to run this app. Rails 6.0 多数据库正确实现:仅指定模型访问非主库
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6.0 多数据库正确实现:仅指定模型访问非主库

Rails 单项目多数据库独立访问实现方案

直接在普通业务模型中调用establish_connection会污染ActiveRecord全局连接池,导致所有模型的查询都切换到该连接,可按Rails版本选择以下方案实现仅指定模型访问非主库。


方案1:Rails 6及以上版本(官方原生支持,推荐)

步骤1:配置多数据库信息

在config/database.yml中添加非主库的连接配置,示例如下:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  # 主库配置,保持原有逻辑不变
  primary:
    <<: *default
    database: myapp_primary_development
  # 第二个库db_2的配置
  db_2:
    <<: *default
    database: myapp_db2_development
    migrations_paths: db/db2_migrate # 可选配置,单独存放db_2的迁移文件

步骤2:创建非主库抽象基类

新增独立的抽象模型基类封装db_2的连接,必须设置abstract_class = true避免污染全局连接:

# app/models/db2_base.rb
class Db2Base < ApplicationRecord
  self.abstract_class = true
  # 配置db_2的读写连接,如有读写分离可分别指定不同库
  connects_to database: { writing: :db_2, reading: :db_2 }
end

步骤3:业务模型继承对应基类

所有需要访问db_2的模型统一继承Db2Base,其余默认模型继续继承ApplicationRecord即可自动走主库:

# app/models/user_db_2.rb
class UserDb2 < Db2Base
  # 正常编写模型业务逻辑即可,所有CURD自动走db_2
end

方案2:Rails 5及更低版本兼容方案

旧版本Rails无原生多数据库支持,可通过抽象基类封装独立连接实现:

步骤1:配置多数据库信息

和方案1一致,在config/database.yml中添加db_2的连接配置。

步骤2:创建非主库抽象基类

# app/models/db2_base.rb
class Db2Base < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :db_2
end

步骤3:业务模型继承对应基类

和方案1一致,需要访问db_2的模型继承Db2Base,其余模型保持原有继承逻辑不变。


验证方式

可在Rails控制台执行以下命令验证连接隔离效果:

  • 主库模型连接验证:ApplicationRecord.connection_db_config.database,返回主库名称
  • db_2模型连接验证:Db2Base.connection_db_config.database,返回db_2名称

内容的提问来源于stack exchange,提问作者Baran Yeni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 23:48:03