微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。