Rails これどう違うんだっけ DBセットアップコマンド

前回に引き続き今回も初学者向けRails備忘録です。

今回はDBをセットアップしたり、リセットしたりするときに使うコマンド編です。

DBを初期化したい

開発しはじめる時、もしくは開発途中で動作確認でいろいろDBにデータをつっこんだりした後不整合なデータを作ってしまったときなど、開発中に何度かDBを初期化したい場面があります。

そんな時に使うコマンドを比較して、なにがどう違うのか見てみました。

コマンドと選択肢

DB系のRake taskはRailsの/activerecord/lib/active_record/railties/databases.rakeを見ましょう。

この中でDBの初期化にあたって有用なコマンドは以下のとおりです。

  • bin/rails db:setup
  • bin/rails db:reset
  • bin/rails db:migrate:reset

db:setup

これは

["db:schema:load_if_ruby", "db:structure:load_if_sql", :seed]

をやっています。

そして、db:schema:load_if_*の中は記述に応じて
Rubyならschema:load、SQLならstructure:loadをしつつ
db:createをしています。

つまり

  • db:create with schema or structure
  • seed

を行います。

注意点は、

  • DBはdropしない
    • = DBがcreateされていないときにやる(初回など)
  • migrationはshcemaまたはstructureを元にテーブルがcreateされる
  • seed(初期データの投入)も行なわれる

の3点ですね。

db:reset

こちらは

[ "db:drop", "db:setup" ]

となっているので、前述のsetupの前に一度DBをdropしているだけです。
したがって注意点はsetupと同様に、schemaまたはstructureを参照すること。

ちなみにdropはDBが存在しなくてもエラーで止まったりしないので、setupの変わりに使うようなこともできます。

db:migrate:reset

こちらは

["db:drop", "db:create", "db:migrate"]

をやっています。

なので純粋にDBをdropしてcreateしなおして、migrateを頭から実行しなおす、というものです。

使いどころとしては、例えば基本的にはおこらないのですが、それでも稀にmigrationの記述とschema(structure)の整合性がとれてない状態になってしまうことがあります。こちらは整合性が合わなくても、migrationファイルのみの参照なのでその問題にも対応できます。

またseedを実行しないのもポイントです。

まとめ

今回はDB初期化系のRake taskをおさらいしてみました。今回のケースではググってナレッジ共有サイトの情報を見るよりソースコードを読んだほうが信憑性も確実で早いですね。ただし初学者にはこのrake taskがどこに書いてあるのが探すのが難しい、というハードルも別にありますが。

ともあれちゃんとソースコードを当たる、というのは重要ですし意外に難しいことが書いてあるわけでもない、というのは体験しておくべきですね。

僕のReleaseNote[0.38.10] & 僕のRoadMap[0.38.11]Rails これどう違うんだっけ 存在確認編