截断、事务和删除数据库策略之间的区别

8 浏览
0 Comments

截断、事务和删除数据库策略之间的区别

在使用Rspec时,截断(truncation)、事务(transaction)和删除(deletion)数据库策略有什么区别?我找不到任何解释这些策略的资源。我读了Database Cleaner的自述文件,但它没有解释每个策略的作用。\n为什么在使用Capybara时我们必须使用截断策略?在测试时我是否必须清理我的数据库,还是可以禁用它?我不明白为什么我应该在每个测试案例之后清理数据库,这难道不会减慢测试速度吗?

0
0 Comments

数据库清理策略是指数据库术语。也就是说,这些术语来自(SQL)数据库领域,所以熟悉数据库术语的人通常知道它们的含义。

下面的示例是指SQL定义。不过,DatabaseCleaner也支持其他非SQL类型的数据库,但是定义通常是相同或类似的。

删除

这意味着使用SQL的DELETE FROM语句清空数据库表。这通常比截断慢,但可能具有其他优势。

截断

这意味着使用TRUNCATE TABLE语句清空数据库表。这将立即清空表,而不会删除表结构本身或逐个删除记录。

事务

这意味着使用BEGIN TRANSACTION语句结合ROLLBACK来回滚先前数据库操作的序列。可以将其视为数据库的“撤消按钮”。我认为这是最常用的清理方法,可能也是最快的,因为更改不需要直接提交到数据库。

截断策略与Capybara的原因

Capybara文档中找到的最好的解释:

# Transactional fixtures do not work with Selenium tests, because Capybara
# uses a separate server thread, which the transactions would be hidden
# from. We hence use DatabaseCleaner to truncate our test database.

清理要求

您不一定需要在每个测试用例之后清理数据库。但是您需要注意这可能会产生的副作用。也就是说,如果您在一步中创建、修改或删除某些记录,其他步骤会受到影响吗?

通常,RSpec在开启事务性固定装置的情况下运行,所以在运行RSpec时您不会注意到这一点-它会自动为您保持数据库清洁:

https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions

感谢您的详细解释。rspec-rails文档的链接也非常有用。非常感谢您的帮助 🙂

这并不完全正确。实际上,删除策略应该比截断更快,因为它执行的是DELETE FROM table而不是TRUNCATE TABLE table,所以它会删除所有记录而不会重置序列等操作。

0