Rails6, 7でのdb系rakeタスクの確認

この辺いつも忘れるのでメモ。 あと、paperclipを削除するときにmigrationファイルの add_attachment が残ってしまう問題があったので、どう影響するかの確認のためでもある。

db:migrate

migrateファイルを日付け順に実行する。なので、削除された外部依存(e.g. paperclipの add_attachment )があればそこでundefinedのエラーになる。

db:schema:load

schema.rbから実行する。migrateファイルは実行しない。速いのでいいのだけど、

execute (“ALTER TABLE apples AUTO_INCREMENT = 9999”)

みたいなのはschemaに載らないので実行されないのに注意。

db:prepare

6以降のbin/setupからはこれが呼ばれる。以下の挙動の通りなので、普段はこれ呼ぶだけでもいい。

DBがなければ以下を実行。

  • db:create
  • db:schema:load
  • db:seed

DBがあれば以下を実行。

  • db:migrate

db:setup

DBがなければ作り、あってもスキーマロードを実行する。なので、普段からこれを使うことはない。

  • db:create
  • db:schema:load
  • db:seed

db:truncate_all

テーブルを全部truncateしてくれる。 Rails6の時点でヘルプに出てこなかったけど存在している。 rails/databases.rake at d5fc7da4c39470a8f5b0055eddc2d1bca2d034e3 · rails/rails · GitHub

paperclipを削除して困らない?

困らないので削除していい。

削除して困るのは一から db:migrate を実行するケース。

本番環境では、最初からmigrateすることはない。

開発環境では、 db:prepareスキーマロードするのでいい。ALTER TABLE が走らないけど開発環境なら支障はない。

ステージング環境を増やすみたいなときは、既存の環境のデータを持ってきて、 db:truncate_all すればいい。そしたらデータがなくてAUTO_INCREMENTが進んだ状態を作れる。

ということで、マイグレーションを一から実行することはないので、squasher gemみたいなのは使う意味がないと思う。