ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked


はじめに

rails tutorialを学習中です。
学習中、テスト実行時に何度も遭遇したエラー

RuntimeError:         RuntimeError: database is locked
ActiveRecord::StatementInvalid:         ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked

これらがようやく回避できるようになりましたので記しておこうかと思います。

因みに余談ですが、9章まではこのエラーが出ても何度か繰り返し

rails test

とすると5回目くらいでパスすることが出来ていました。(非常に面倒でした)
しかし9章にて何度実行してもパス出来なくなりました。

試したこと

①rails consoleにて

ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")

を実行

結果 効果なし

②database.ymlファイルにて、timeoutの値を5000から15000に変更

結果 効果なし

③db/test.sqlite3ファイルの名前を変更

#sample_app/dbディレクトリにて
mv test.sqlite3 new.test.sqlite3

元と同じファイル名でコピー。

cp -p new.test.sqlite3 test.sqlite3

new.test.sqlite3ファイルは消去

結果 効果なし

④DB Browser for SQLiteに移り、以下のショートカットを実行
Ctrl + S
(左上の[ファイル]から[変更の書き込み]でもいいと思います。ちなみに私は変更がなかったからか、クリックできませんでした。意味がないとわかりつつも一応コマンドでCtrl + Sをしてみました)
更に念のためと
Ctrl + Shift + S

2つのショートカット実行後、DB Browser for SQLiteを終了、ターミナルなども全て一度終了し、起動しなおす。

結果 効果なし

⑤test/test_help.rbファイルの

#恐らく8、9行目くらい
parallelize(workers: :number_of_processors, with: :threads)

をコメントアウトにする

# parallelize(workers: :number_of_processors, with: :threads)

結果 エラーが表示されず、テストがパスするようになった!!

参考記事

①②④
https://stackoverflow.com/questions/58854780/what-does-the-database-is-locked-error-message-mean-in-ruby-on-rails-testing

http://fanblogs.jp/scripts/archive/61/0

https://stackoverflow.com/questions/58854780/what-does-the-database-is-locked-error-message-mean-in-ruby-on-rails-testing (一番最後の回答)

終わりに

同じエラーに悩まされている方の参考になれば幸いです。