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

参考这个linkhttps://github.com/rails/rails/issues/40640