0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PostgreSQL】テスト環境でのシーケンスの自動採番がリセットされない

Posted at

発生した現象

RSpecでテスト実行後、普通はデータベースはリセットされてPKが1から採番されると思いますが、
何故かリセットされずテスト実行の度にPKがインクリメントしていくという現象が起きていました。


[例]

  • 1回目のテストを実行し、Userのテストデータを5人分作成したらusersテーブルのidが1〜5まで生成される。
  • 1回目を終え、2回目のテストを実行するとusersテーブルのidが6〜10が生成される。レコード自体は残っていない。

といった感じです。

別にバグやエラーというわけではないですが、気持ち悪かったので解消しようと思い
一応解決したので備忘録として残します。

環境

  • Ruby 3.2.2
  • Ruby on Rails 7.1.1
  • PostgreSQL 15.3

docker composeで環境構築しています。

原因

結論、特定はできませんでした。
(わかる方いらっしゃればコメントいただけますと幸いです)

調べていてよく出てきたのは
「rails_helper.rbのconfig.use_transactional_fixturesがfalseになっているとデータベースがロールバックされないよ〜」
とかでしたが、データは消えているので違いそうでした。。

解決策

テーブルに対してreset_pk_sequence!を使えば、
見事テスト実行の度にシーケンスの自動採番が1から生成されるようになりました。

before(:suite)を指定することで、テストスイート実行の前に毎回実行されます。

ちなみにreset_pk_sequence!はDBがPostgreSQLの時だけ使えるようです。

spec/rails_helper.rb
RSpec.configure do |config|
###
  config.before(:suite) do
    ActiveRecord::Base.connection.tables.each do |table_name|
      ActiveRecord::Base.connection.reset_pk_sequence!(table_name)
    end
  end
###
end

参考記事

以下の記事で解決しました。
感謝です!!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?