Disable multi-db for SQLite

This commit is contained in:
Donal McBreen
2025-11-20 14:57:44 +00:00
parent bb36b4846f
commit cc7e091508
6 changed files with 55 additions and 21 deletions
+1 -6
View File
@@ -1,12 +1,7 @@
class ApplicationRecord < ActiveRecord::Base
primary_abstract_class
# SQLite doesn't use separate replica databases
if ENV.fetch("DATABASE_ADAPTER", "mysql") == "sqlite"
connects_to database: { writing: :primary, reading: :primary }
else
connects_to database: { writing: :primary, reading: :replica }
end
configure_replica_connections
attribute :id, :uuid, default: -> { ActiveRecord::Type::Uuid.generate }
end
+1 -7
View File
@@ -4,14 +4,8 @@ ActiveSupport.on_load(:active_storage_blob) do
end
end
# Use DB read/write splitting for Active Storage models
ActiveSupport.on_load(:active_storage_record) do
# SQLite doesn't use separate replica databases
if ENV.fetch("DATABASE_ADAPTER", "mysql") == "sqlite"
connects_to database: { writing: :primary, reading: :primary }
else
connects_to database: { writing: :primary, reading: :replica }
end
configure_replica_connections
end
module ActiveStorageControllerExtensions
@@ -1,3 +1,5 @@
require_relative "extensions"
class DatabaseRoleLogger
def initialize(app)
@app = app
@@ -10,4 +12,6 @@ class DatabaseRoleLogger
end
end
if ActiveRecord::Base.replica_configured?
Rails.application.config.middleware.insert_after ActiveRecord::Middleware::DatabaseSelector, DatabaseRoleLogger
end
+3
View File
@@ -1,7 +1,10 @@
require "deployment"
require_relative "extensions"
if ActiveRecord::Base.replica_configured?
Rails.application.configure do
config.active_record.database_selector = { delay: 1.second }
config.active_record.database_resolver = Deployment::DatabaseResolver
config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end
end
@@ -43,6 +43,4 @@ module AccountSlug
def self.encode(id) FORMAT % id end
end
Rails.application.config.middleware.tap do |stack|
stack.insert_before ActiveRecord::Middleware::DatabaseSelector, AccountSlug::Extractor
end
Rails.application.config.middleware.insert_after Rack::TempfileReaper, AccountSlug::Extractor
@@ -0,0 +1,40 @@
# frozen_string_literal: true
# Adds a helper method to check if replica database connections are configured
# and automatically configures read/write splitting when replicas are available.
#
# Usage:
# class ApplicationRecord < ActiveRecord::Base
# configure_replica_connections
# end
module ActiveRecordReplicaSupport
extend ActiveSupport::Concern
class_methods do
# Automatically configures connects_to for read/write splitting if a replica
# database is configured for the current environment. This is a no-op if no
# replica configuration exists.
#
# Example:
# class ApplicationRecord < ActiveRecord::Base
# configure_replica_connections
# end
def configure_replica_connections
if replica_configured?
connects_to database: { writing: :primary, reading: :replica }
end
end
# Returns true if a replica database configuration exists for the current
# environment. This allows different database adapters to opt in or out of
# read/write splitting based on their database.yml configuration.
#
# Example:
# ApplicationRecord.replica_configured? # => true for MySQL, false for SQLite
def replica_configured?
configurations.find_db_config("replica").present?
end
end
end
ActiveRecord::Base.include ActiveRecordReplicaSupport