如何加载自定义数据库适配器?以便在评估“database.yml”时准备好了吗?
How to load custom db adapter ? so that its ready when `database.yml` is evaluated?
在 rails 4 中,我试图编写自己的数据库适配器,但是,似乎 database.yml
在加载我的适配器之前进行了评估,导致错误:
Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.
我的客户适配器位于 lib/active_record/connection_handling/proxy_mysql2_adapter.rb
,我尝试使用 config.eager_load_paths
在 config/application.rb
加载它是行不通的,因为它不是在 config/database.yml
评估之前加载的。
我将如何加载我的数据库适配器?以便在评估 database.yml
时准备好?
以上是完整的错误:
App 25085 output: Error: The application encountered the following error: Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile. (LoadError)
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_adapters/connection_specification.rb:175:in `spec'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_handling.rb:50:in `establish_connection'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-import-0.13.0/lib/activerecord-import.rb:7:in `establish_connection_with_activerecord_import'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/railtie.rb:120:in `block (2 levels) in <class:Railtie>'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:38:in `instance_eval'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:38:in `execute_hook'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:28:in `block in on_load'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:27:in `each'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:27:in `on_load'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/railtie.rb:116:in `block in <class:Railtie>'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `instance_exec'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `run'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:55:in `block in run_initializers'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `call'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:54:in `run_initializers'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/application.rb:352:in `initialize!'
App 25085 output: /var/www/backend/releases/20200310141409/config/environment.rb:5:in `<top (required)>'
App 25085 output: config.ru:3:in `require'
App 25085 output: config.ru:3:in `block in <main>'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/rack-1.6.13/lib/rack/builder.rb:55:in `instance_eval'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/rack-1.6.13/lib/rack/builder.rb:55:in `initialize'
App 25085 output: config.ru:1:in `new'
App 25085 output: config.ru:1:in `<main>'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:101:in `eval'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:101:in `preload_app'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:189:in `block in <module:App>'
App 25085 output: /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:380:in `run_block_and_record_step_progress'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:188:in `<module:App>'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:30:in `<module:PhusionPassenger>'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `<main>'
[ E 2020-03-10 15:22:10.0768 25063/Tf age/Cor/App/Implementation.cpp:221 ]: Could not spawn process for application /var/www/backend/current: The application encountered the following error: Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile. (LoadError)
Error ID: 91fbd9ce
Error details saved to: /tmp/passenger-error-qdkLuQ.html
EDIT2
我试图将它放入 initializers 文件夹,但我得到了相同的结果,完整的适配器可以在这里找到:https://gist.github.com/arthurchui/f4d1d74d5e91f5307b5c6c78bdfde365
Rails 只需要将该文件放在加载路径上,您可以将它放在 $LOAD_PATH
中的目录之一中,在初始化捆绑器之后,但在加载应用程序之前,所以 <rails_root>/lib/active_record/connection_adapters/proxy_mysql2_adapter.rb
合适。
确保它不会在加载时引发 LoadError
或 Gem::LoadError
- 如果您的适配器无法要求其他依赖项,rails 将认为它找不到适配器或其gem.
在 rails 4 中,我试图编写自己的数据库适配器,但是,似乎 database.yml
在加载我的适配器之前进行了评估,导致错误:
Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.
我的客户适配器位于 lib/active_record/connection_handling/proxy_mysql2_adapter.rb
,我尝试使用 config.eager_load_paths
在 config/application.rb
加载它是行不通的,因为它不是在 config/database.yml
评估之前加载的。
我将如何加载我的数据库适配器?以便在评估 database.yml
时准备好?
以上是完整的错误:
App 25085 output: Error: The application encountered the following error: Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile. (LoadError)
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_adapters/connection_specification.rb:175:in `spec'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_handling.rb:50:in `establish_connection'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-import-0.13.0/lib/activerecord-import.rb:7:in `establish_connection_with_activerecord_import'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/railtie.rb:120:in `block (2 levels) in <class:Railtie>'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:38:in `instance_eval'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:38:in `execute_hook'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:28:in `block in on_load'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:27:in `each'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:27:in `on_load'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/railtie.rb:116:in `block in <class:Railtie>'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `instance_exec'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `run'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:55:in `block in run_initializers'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `call'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each'
App 25085 output: /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:54:in `run_initializers'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/application.rb:352:in `initialize!'
App 25085 output: /var/www/backend/releases/20200310141409/config/environment.rb:5:in `<top (required)>'
App 25085 output: config.ru:3:in `require'
App 25085 output: config.ru:3:in `block in <main>'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/rack-1.6.13/lib/rack/builder.rb:55:in `instance_eval'
App 25085 output: /var/www/backend/shared/bundle/ruby/2.3.0/gems/rack-1.6.13/lib/rack/builder.rb:55:in `initialize'
App 25085 output: config.ru:1:in `new'
App 25085 output: config.ru:1:in `<main>'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:101:in `eval'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:101:in `preload_app'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:189:in `block in <module:App>'
App 25085 output: /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:380:in `run_block_and_record_step_progress'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:188:in `<module:App>'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:30:in `<module:PhusionPassenger>'
App 25085 output: /usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `<main>'
[ E 2020-03-10 15:22:10.0768 25063/Tf age/Cor/App/Implementation.cpp:221 ]: Could not spawn process for application /var/www/backend/current: The application encountered the following error: Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile. (LoadError)
Error ID: 91fbd9ce
Error details saved to: /tmp/passenger-error-qdkLuQ.html
EDIT2
我试图将它放入 initializers 文件夹,但我得到了相同的结果,完整的适配器可以在这里找到:https://gist.github.com/arthurchui/f4d1d74d5e91f5307b5c6c78bdfde365
Rails 只需要将该文件放在加载路径上,您可以将它放在 $LOAD_PATH
中的目录之一中,在初始化捆绑器之后,但在加载应用程序之前,所以 <rails_root>/lib/active_record/connection_adapters/proxy_mysql2_adapter.rb
合适。
确保它不会在加载时引发 LoadError
或 Gem::LoadError
- 如果您的适配器无法要求其他依赖项,rails 将认为它找不到适配器或其gem.