【问题标题】:Rspec with database_cleaner on Sequel causes foreign key truncation errorSequel 上带有 database_cleaner 的 Rspec 导致外键截断错误
【发布时间】:2016-11-24 09:39:35
【问题描述】:

我正在以下 Sequel 模型上使用 DatabaseCleaner 运行 RSpec 测试

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 插件有关?

【问题讨论】:

    标签: ruby rspec database-cleaner sequel-gem


    【解决方案1】:

    好的,这是一个开放的issue with DatabaseCleaner。解决方法是在截断之前禁用引用键约束,然后重新启用它们。

    使用 MySQL 会是这样:

    DB.run('SET FOREIGN_KEY_CHECKS=0;')
    DatabaseCleaner.clean_with(:truncation)
    DB.run('SET FOREIGN_KEY_CHECKS=1;')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2017-08-02
      • 2017-11-08
      • 2014-07-19
      • 2018-11-13
      • 2012-08-26
      • 2021-06-24
      相关资源
      最近更新 更多