使用 sequel 和数据库清理器的外键约束问题
Foreign Key constraint issues using sequel and database cleaner
我 运行 遇到使用 database cleaner with sequel 和 sqlite 外键约束的问题。具体来说,我将 :truncation
策略与 Capybara 集成测试一起使用。
对于给定的示例架构:
CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE events(id INTEGER PRIMARY KEY, title TEXT);
CREATE TABLE events_users(
user_id INTEGER,
event_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(event_id) REFERENCES events(id)
);
和sequel 型号:
class User < Sequel::Model
many_to_many :events
end
class Event < Sequel::Model
many_to_many :users
end
运行 以下:
# normally this would be run in
# an rspec before(:each) for my :feature specs
DatabaseCleaner.start
DatabaseCleaner.strategy = :truncation
bob = User.create(name: "bob")
sally = User.create(name: "sally")
event = Event.create(title: "Everyone's invited")
event.users << [bob, sally]
DatabaseCleaner.clean
结果出错
SQLite3::ConstraintException: FOREIGN KEY constraint failed (Sequel::ForeignKeyConstraintViolation)
我可以通过更改我的 before 语句来禁用 foreign_keys PRAGMA 来解决这个问题:
DB.foreign_keys = false
DatabaseCleaner.start
DatabaseCleaner.strategy = :truncation
(或者不在我的表中使用 FOREIGN KEY),但这似乎是错误的,因为我想要外键约束的好处——或者至少我认为我这样做;)。
这是对如何使用外键约束的根本误解,还是有更好的方法来做到这一点?
已经快两年了,我已经放弃尝试彻底解决这个问题T_T。
我在最近的 sequel
升级过程中遇到了随机 FOREIGN KEY constraint failed
问题。为了解决这个问题,我从 DatabaseCleaner.strategy = :truncation
切换到 DatabaseCleaner.strategy = :deletion
。
有一个 thorough analysis of the benefits/costs of :truncate
versus :delete
,答案(至少对于 postgres)是 这取决于 。到目前为止 :delete
对于我的小测试数据集来说似乎快了一点。
我 运行 遇到使用 database cleaner with sequel 和 sqlite 外键约束的问题。具体来说,我将 :truncation
策略与 Capybara 集成测试一起使用。
对于给定的示例架构:
CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE events(id INTEGER PRIMARY KEY, title TEXT);
CREATE TABLE events_users(
user_id INTEGER,
event_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(event_id) REFERENCES events(id)
);
和sequel 型号:
class User < Sequel::Model
many_to_many :events
end
class Event < Sequel::Model
many_to_many :users
end
运行 以下:
# normally this would be run in
# an rspec before(:each) for my :feature specs
DatabaseCleaner.start
DatabaseCleaner.strategy = :truncation
bob = User.create(name: "bob")
sally = User.create(name: "sally")
event = Event.create(title: "Everyone's invited")
event.users << [bob, sally]
DatabaseCleaner.clean
结果出错
SQLite3::ConstraintException: FOREIGN KEY constraint failed (Sequel::ForeignKeyConstraintViolation)
我可以通过更改我的 before 语句来禁用 foreign_keys PRAGMA 来解决这个问题:
DB.foreign_keys = false
DatabaseCleaner.start
DatabaseCleaner.strategy = :truncation
(或者不在我的表中使用 FOREIGN KEY),但这似乎是错误的,因为我想要外键约束的好处——或者至少我认为我这样做;)。
这是对如何使用外键约束的根本误解,还是有更好的方法来做到这一点?
已经快两年了,我已经放弃尝试彻底解决这个问题T_T。
我在最近的 sequel
升级过程中遇到了随机 FOREIGN KEY constraint failed
问题。为了解决这个问题,我从 DatabaseCleaner.strategy = :truncation
切换到 DatabaseCleaner.strategy = :deletion
。
有一个 thorough analysis of the benefits/costs of :truncate
versus :delete
,答案(至少对于 postgres)是 这取决于 。到目前为止 :delete
对于我的小测试数据集来说似乎快了一点。