我遵循了 使用 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 会自动神奇地处理这个问题吗?
我之前假设 Rails 会将数据从主数据库复制到副本,但现在我正在输入此内容,我想知道是否要以某种方式在 Postgres 中手动设置数据复制?
Rails 不会将数据从主副本复制到副本。您需要自己设置。