我目前正在运行PostgreSQL的rails项目中使用DatabaseCleaner,并将其设置如下。
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation, { pre_count: true, reset_ids: true })
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
在我的一个rails测试套件中,我打印出一个实例的id。我认为它应该是相对较小的数字,因为clean_with(:truncate)假设清除db并在其上运行真空。但每次运行测试时它都会增加。
测试通过,它使用的顺序并不重要。但为什么clean_with(:truncation)
不会以某种方式运作呢?
======编辑======
这是在RSpec测试的范围内。我理解序列编号对性能没有影响,但是对每个套件进行昂贵的清理(:截断)并使用廉价和快速清理(:事务)。所以我想了解为什么clean_with(:truncation)
在运行测试套件之前没有为我重置id以获得干净的db状态。
答案 0 :(得分:4)
这就是数据库的工作原理。
$ createdb test1
$ psql -d test1
> create table numbers (id serial, x integer);
> insert into numbers (x) values (1), (2), (3);
> select id from numbers order by id desc limit 1;
# 3
> truncate numbers;
> insert into numbers (x) values (1), (2);
> select id from numbers order by id desc limit 1;
# 5
如您所见,数据库清除程序的:truncate
表示truncate
。希望这是有道理的。
编辑 - 完全错过了这个问题。
:reset_ids
无法正常工作的原因是postgresql版本较低。使用psql --version
查找您的版本,并从数据库清理器源中获取8.4或更高版本。
@restart_identity ||= db_version >= 80400 ? 'RESTART IDENTITY' : ''
我正在运行9.3.5,工作正常。
> truncate numbers restart identity;
> insert into numbers (x) values (1);
> select * from numbers;
# id | x
# ----+---
# 1 | 1
为确保数据库清理工作正常。
require 'rails/all'
require 'database_cleaner'
ActiveRecord::Base.establish_connection('postgres://localhost/test1')
class Number < ActiveRecord::Base; end
Number.count
# => 1
DatabaseCleaner.clean_with(:truncation, reset_ids: true)
重置串行列。
$ psql -d test1
> insert into numbers (x) values (1);
> select * from numbers;
# id | x
# ----+---
# 1 | 1