gpt4 book ai didi

ruby - 使用续集和数据库清理器的外键约束问题

转载 作者:IT王子 更新时间:2023-10-29 06:26:36 26 4
gpt4 key购买 nike

我在使用 database cleaner 时遇到问题与 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)
);

和续集模型:

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 对于我的小型测试数据集来说似乎要快一些。

关于ruby - 使用续集和数据库清理器的外键约束问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34457516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com