Rspec with database_cleaner на Sequel вызывает ошибку усечения внешнего ключа

Я запускаю тесты RSpec с DatabaseCleaner на следующих моделях сиквела

class User < Sequel::Model
      one_to_many :memberships
      many_through_many :accounts, [[:memberships, :user_id, :account_id]]
end

class Account < Sequel::Model 
      one_to_many :memberships
      many_through_many :users, [[:memberships, :user_id, :account_id]]
end

class Membership < Sequel::Model
      many_to_one :account
      many_to_one :user
end

когда я запускаю тесты, я получаю следующую ошибку:

An error occurred in a `before(:suite)` hook.
Failure/Error: DatabaseCleaner.clean_with(:truncation)

Sequel::DatabaseError:
  Mysql2::Error: Cannot truncate a table referenced in a foreign key constraint (`account_users`.`memberships`, CONSTRAINT `memberships_ibfk_2` FOREIGN KEY (`account_id`) REFERENCES `account_users`.`accounts` (`id`))

Моя установка DatabaseCleaner:

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

DatabaseCleaner должен сбрасывать ограничения внешнего ключа перед усечением, как это происходит с ActiveRecord, который работает нормально.

Мой вопрос: это ошибка DatabaseCleaner-Sequel или это связано с моим использованием плагина Sequel many_through_many?

1 ответ

Хорошо, это открытая проблема с DatabaseCleaner. Обходной путь должен отключить ограничения ссылочного ключа перед усечением и включить их впоследствии.

С MySQL это было бы так:

DB.run('SET FOREIGN_KEY_CHECKS=0;')
DatabaseCleaner.clean_with(:truncation)
DB.run('SET FOREIGN_KEY_CHECKS=1;')
Другие вопросы по тегам