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
相关产品推荐
相关产品推荐

