Nic*_*lin 6 ruby sqlite sequel database-cleaner
我正在使用数据库清理器与续集和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)
);
Run Code Online (Sandbox Code Playgroud)
和续集模特:
class User < Sequel::Model
many_to_many :events
end
class Event < Sequel::Model
many_to_many :users
end
Run Code Online (Sandbox Code Playgroud)
运行以下内容:
# 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
Run Code Online (Sandbox Code Playgroud)
导致错误
SQLite3::ConstraintException: FOREIGN KEY constraint failed (Sequel::ForeignKeyConstraintViolation)
Run Code Online (Sandbox Code Playgroud)
我可以通过改变我的before语句来禁用foreign_keys PRAGMA来解决这个问题:
DB.foreign_keys = false
DatabaseCleaner.start
DatabaseCleaner.strategy = :truncation
Run Code Online (Sandbox Code Playgroud)
(或者在我的表中没有使用FOREIGN KEY),但这似乎是错的,因为我想要外键约束的好处 - 或者至少我认为我做的;).
这是对如何使用外键约束的基本误解,还是有更好的方法来做到这一点?
已经快两年了,我已经放弃尝试彻底解决这个问题了 T_T。
我FOREIGN KEY constraint failed
在最近的升级过程中遇到了随机问题sequel
。为了解决这个问题,我从 切换DatabaseCleaner.strategy = :truncation
到DatabaseCleaner.strategy = :deletion
.
对对比的好处/成本:truncate
:delete
进行了彻底的分析,答案(至少对于 postgres 来说)是这取决于。到目前为止,:delete
对于我的小测试数据集来说似乎要快一些。
归档时间: |
|
查看次数: |
705 次 |
最近记录: |