Mysql2::Error: MySQL client is not connected -- 当使用多个数据库运行 DatabaseCleaner 时

问题描述

Rails 5.2

我正在尝试在 RSpec 中实现一种能够清理多个数据库数据库清理策略。为此,我使用具有以下设置的 DatabaseCleaner gem:

require 'database_cleaner/active_record'
require 'byebug'

CONNECTIONS = [
  app1,app2
].map { |app| app::DATABASE_CONNECTION.to_sym }.freeze

RSpec.configure do |config|
  config.before(:suite) do
    CONNECTIONS.each do |con|
      ActiveRecord::Base.establish_connection con
      DatabaseCleaner.start
      DatabaseCleaner.clean_with(:truncation)
    end
  end

  config.before(:each) do
    CONNECTIONS.each do |con|
      ActiveRecord::Base.establish_connection con
      DatabaseCleaner.strategy = :transaction
    end
  end

  config.before(:each,:deletion_strategy => true) do
    CONNECTIONS.each do |con|
      ActiveRecord::Base.establish_connection con
      DatabaseCleaner.strategy = :deletion
    end
  end

  config.before(:each) do
    CONNECTIONS.each do |con|
      ActiveRecord::Base.establish_connection con
      DatabaseCleaner.start
    end
  end

  config.after(:each) do
    CONNECTIONS.each do |con|
      ActiveRecord::Base.establish_connection con
      DatabaseCleaner.clean
    end
  end
end

对于策略设置为 :deletion 的测试,after(:each) 块在循环的第二次迭代中生成以下错误(app1 的数据库被清除没有问题)。

Failure/Error: DatabaseCleaner.clean

 ActiveRecord::StatementInvalid:
   MysqL2::Error: MysqL client is not connected: SELECT @@FOREIGN_KEY_CHECKS
 # /usr/local/bundle/gems/MysqL2-0.4.10/lib/MysqL2/client.rb:120:in `_query'
 # /usr/local/bundle/gems/MysqL2-0.4.10/lib/MysqL2/client.rb:120:in `block in query'
 # /usr/local/bundle/gems/MysqL2-0.4.10/lib/MysqL2/client.rb:119:in `handle_interrupt'
 # /usr/local/bundle/gems/MysqL2-0.4.10/lib/MysqL2/client.rb:119:in `query'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract_MysqL_adapter.rb:187:in `block (2 levels) in execute'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/dependencies/interlock.rb:48:in `block in permit_concurrent_loads'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/dependencies/interlock.rb:47:in `permit_concurrent_loads'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract_MysqL_adapter.rb:186:in `block in execute'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:581:in `block (2 levels) in log'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:580:in `block in log'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:571:in `log'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract_MysqL_adapter.rb:185:in `execute'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/MysqL/database_statements.rb:28:in `execute'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/MysqL/database_statements.rb:19:in `query'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:98:in `query_value'
 # /usr/local/bundle/gems/activerecord-5.2.5/lib/active_record/connection_adapters/abstract_MysqL_adapter.rb:152:in `disable_referential_integrity'
 # /usr/local/bundle/gems/database_cleaner-active_record-2.0.1/lib/database_cleaner/active_record/deletion.rb:8:in `clean'
 # /usr/local/bundle/gems/database_cleaner-core-2.0.1/lib/database_cleaner/cleaners.rb:28:in `block in clean'
 # /usr/local/bundle/gems/database_cleaner-core-2.0.1/lib/database_cleaner/cleaners.rb:28:in `each'
 # /usr/local/bundle/gems/database_cleaner-core-2.0.1/lib/database_cleaner/cleaners.rb:28:in `clean'
 # ./spec/support/database_cleaner.rb:106:in `block (3 levels) in <top (required)>'
 # ./spec/support/database_cleaner.rb:100:in `each'
 # ./spec/support/database_cleaner.rb:100:in `block (2 levels) in <top (required)>'
 # ./spec/rails_helper.rb:92:in `block (2 levels) in <top (required)>'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/dependencies.rb:285:in `load'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/dependencies.rb:285:in `block in load'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/dependencies.rb:257:in `load_dependency'
 # /usr/local/bundle/gems/activesupport-5.2.5/lib/active_support/dependencies.rb:285:in `load'
 # /usr/local/bundle/gems/spring-commands-rspec-1.0.4/lib/spring/commands/rspec.rb:18:in `call'
 # -e:1:in `<main>'
 # ------------------
 # --- Caused by: ---
 # MysqL2::Error:
 #   MysqL client is not connected
 #   /usr/local/bundle/gems/MysqL2-0.4.10/lib/MysqL2/client.rb:120:in `_query'

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)