Rails 7 只读副本数据库未在多数据库配置中填充

问题描述 投票:0回答:1

我遵循了 使用 ActiveRecord 的多个数据库配置我的开发环境的指南。我有 3 个数据库,其中 2 个是主数据库,一个应该是只读副本。

我的问题是只读副本数据库未填充我已验证数据是否在 2 个主数据库之间正确分割,我有 2 个数据库架构文件,并且在执行

get 时应用程序中没有任何错误
请求。然而,只读副本数据库是空的。

我的想法是我的读写数据库之间自动连接切换的配置可能有问题?该指南说您需要手动设置只读副本数据库,但没有给出任何说明。我正在使用 Postgresql 和 Rails 7.0.3。

我之前假设 Rails 会将数据从主数据库复制到副本,但现在我正在输入此内容,我想知道是否要以某种方式在 Postgres 中手动设置数据复制?

我不确定application_record中是否需要

primary_abstract_class
self.abstract_class = true
? Rails 7 默认添加
primary_abstract_class
,多数据库指南告诉你添加
self.abstract_class = true

应用程序/模型/application_record.rb

class ApplicationRecord < ActiveRecord::Base
  primary_abstract_class

  self.abstract_class = true
  connects_to database: { writing: :primary, reading: :primary }  
end

应用程序/模型/offices_record.rb

class OfficesRecord < ApplicationRecord
  self.abstract_class = true

  # this isn't the name of the actual databases, but rather the primary/replica key in database.yml
  connects_to database: { writing: :offices, reading: :offices_replica }
end

配置/数据库.yml

development:
  primary:
    <<: *default
    database: myapp_development
    migrations_paths: db/migrate

  offices:
    <<: *default
    database: myapp_offices_development    
    migrations_paths: db/offices_migrate

  # replica user's database permissions should be set to read-only.
  offices_replica:
    <<: *default
    database: myapp_offices_replica_development  
    username: read_only_user
    password: R34dOnlyUs3rP@ssw0rd
    replica: true  

配置/初始化程序/multi_db.rb

Rails.application.configure do
  config.active_record.database_selector = { delay: 2.seconds }
  config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
  config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end

office类继承自OfficesRecord而不是ApplicationRecord,因为它位于第二主数据库中。 应用程序/模型/office.rb

class Office < OfficesRecord
end

我如何配置 Postgres

在 Postgres 中,对 myapp_offices_development 数据库进行了数据库备份(没有数据)并通过新数据库进行恢复,以创建名为 myapp_offices_replica_development 的副本。然后,我运行以下命令来创建一个只读用户来访问只读副本。

CREATE ROLE readaccess;
GRANT CONNECT ON DATABASE myapp_offices_replica_development TO readaccess;
GRANT USAGE ON SCHEMA public TO readaccess;
CREATE USER read_only_user WITH PASSWORD ‘R34dOnlyUs3rP@ssw0rd';
GRANT readaccess TO read_only_user;

我正在尝试弄清楚如何使用 myapp_offices_development 中的数据填充数据库 myapp_offices_replica_development。 Rails 会自动神奇地处理这个问题吗?

ruby-on-rails activerecord
1个回答
0
投票

我之前假设 Rails 会将数据从主数据库复制到副本,但现在我正在输入此内容,我想知道是否要以某种方式在 Postgres 中手动设置数据复制?

Rails 不会将数据从主副本复制到副本。您需要自己设置。

© www.soinside.com 2019 - 2024. All rights reserved.