Rails 6 while 运行 sidekiq 数据库配置没有指定适配器
Rails 6 while running sidekiq database configuration does not specify adapter
最近我们开始将我们的代码库从 rails 5 迁移到 rails 6。除了 sidekiq 之外,一切似乎都运行良好。每当我们在生产模式下尝试 运行 sidekiq 时,它总是会抛出错误 数据库配置未指定适配器 。我很确定我们在 database.yml 中提到了一个适配器。有人可以帮忙解决这个问题吗?
供参考
Rails6.0.3.4
Sidekiq 6.1.2
Ruby 2.7.1p83
databsae.yml 文件
default: &default
adapter: postgresql
pool: <%= ENV['DATABASE_POOL'] %>
timeout: 5000
database: anajmandi
development:
primary:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
multidb:
fallback: true
follower:
<<: *default
url: <%= ENV['DATABASE_SLAVE_URL'] %>
replica: true
multidb:
fallback: true
test:
<<: *default
database: db/test.sqlite3
production:
primary:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
multidb:
fallback: true
follower:
<<: *default
url: <%= ENV['DATABASE_SLAVE_URL'] %>
replica: true
multidb:
fallback: true
和sidekiq.rb文件
# typed: strict
if Rails.env.production?
# three unicorns = 3 connections
Sidekiq.configure_client do |config|
config.redis = { :size => 1 }
end
Sidekiq.configure_server do |config|
config.redis = { url: ENV['REDIS_URL'], size: 22 }
Rails.application.config.after_initialize do
Rails.logger.info("DB Connection Pool size for Sidekiq Server before disconnect is: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}")
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DATABASE_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['WORKER_DB_POOL_SIZE'] || Sidekiq.options[:concurrency]
ActiveRecord::Base.establish_connection(config)
Rails.logger.info("DB Connection Pool size for Sidekiq Server is now: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}")
end
end
end
end
这是 运行ning 命令 bundle exec sidekiq -e production -C config/sidekiq.yml
上的错误堆栈跟踪
DB Connection Pool size for Sidekiq Server before disconnect is: 5
database configuration does not specify adapter
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/connection_specification.rb:161:in `spec'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:1052:in `establish_connection'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_handling.rb:51:in `establish_connection'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-import-1.0.6/lib/activerecord-import/import.rb:250:in `establish_connection'
/Users/yadusingla/spars/procol-backend/config/initializers/sidekiq.rb:19:in `block (3 levels) in <top (required)>'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:71:in `class_eval'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:71:in `block in execute_hook'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:43:in `block in on_load'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:42:in `each'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:42:in `on_load'
这里我使用的是 3 层配置,因此没有正确定义 3 层配置的初始值设定项。如果我们 select 通过环境变量进行配置,那么我们将得到两个,主要的和从属的。 Rails 不知道访问哪一个,所以应用程序必须 select 正确的。
将config = Rails.application.config.database_configuration[Rails.env]
改为
self.configurations = Rails.application.config.database_configuration
config = configurations.configs_for(env_name: Rails.env, spec_name: "primary").config
最近我们开始将我们的代码库从 rails 5 迁移到 rails 6。除了 sidekiq 之外,一切似乎都运行良好。每当我们在生产模式下尝试 运行 sidekiq 时,它总是会抛出错误 数据库配置未指定适配器 。我很确定我们在 database.yml 中提到了一个适配器。有人可以帮忙解决这个问题吗?
供参考
Rails6.0.3.4
Sidekiq 6.1.2
Ruby 2.7.1p83
databsae.yml 文件
default: &default
adapter: postgresql
pool: <%= ENV['DATABASE_POOL'] %>
timeout: 5000
database: anajmandi
development:
primary:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
multidb:
fallback: true
follower:
<<: *default
url: <%= ENV['DATABASE_SLAVE_URL'] %>
replica: true
multidb:
fallback: true
test:
<<: *default
database: db/test.sqlite3
production:
primary:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
multidb:
fallback: true
follower:
<<: *default
url: <%= ENV['DATABASE_SLAVE_URL'] %>
replica: true
multidb:
fallback: true
和sidekiq.rb文件
# typed: strict
if Rails.env.production?
# three unicorns = 3 connections
Sidekiq.configure_client do |config|
config.redis = { :size => 1 }
end
Sidekiq.configure_server do |config|
config.redis = { url: ENV['REDIS_URL'], size: 22 }
Rails.application.config.after_initialize do
Rails.logger.info("DB Connection Pool size for Sidekiq Server before disconnect is: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}")
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DATABASE_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['WORKER_DB_POOL_SIZE'] || Sidekiq.options[:concurrency]
ActiveRecord::Base.establish_connection(config)
Rails.logger.info("DB Connection Pool size for Sidekiq Server is now: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}")
end
end
end
end
这是 运行ning 命令 bundle exec sidekiq -e production -C config/sidekiq.yml
DB Connection Pool size for Sidekiq Server before disconnect is: 5
database configuration does not specify adapter
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/connection_specification.rb:161:in `spec'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:1052:in `establish_connection'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_handling.rb:51:in `establish_connection'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-import-1.0.6/lib/activerecord-import/import.rb:250:in `establish_connection'
/Users/yadusingla/spars/procol-backend/config/initializers/sidekiq.rb:19:in `block (3 levels) in <top (required)>'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:71:in `class_eval'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:71:in `block in execute_hook'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:43:in `block in on_load'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:42:in `each'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:42:in `on_load'
这里我使用的是 3 层配置,因此没有正确定义 3 层配置的初始值设定项。如果我们 select 通过环境变量进行配置,那么我们将得到两个,主要的和从属的。 Rails 不知道访问哪一个,所以应用程序必须 select 正确的。
将config = Rails.application.config.database_configuration[Rails.env]
改为
self.configurations = Rails.application.config.database_configuration
config = configurations.configs_for(env_name: Rails.env, spec_name: "primary").config