ruby on rails-DatabaseCleaner.clean_with(:truncate)不会重置自动递增的



我目前在运行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)假设清除数据库并在其上运行vacuum。但每次运行测试时,它都会增加。

测试通过了,使用什么序列并不重要。但为什么CCD_ 2不能以应有的方式工作呢?

======编辑======

这属于RSpec测试的范围。我知道序列号对性能没有影响,但对每个:套件进行昂贵的清理(:截断),并使用廉价快速的清理((:事务)。所以我想了解为什么clean_with(:truncation)在运行测试套件之前没有为我重置id以获得干净的数据库状态。

这就是数据库的工作方式。

$ 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

相关内容

  • 没有找到相关文章

最新更新