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 structureseed
を行います。
注意点は、
- 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がどこに書いてあるのが探すのが難しい、というハードルも別にありますが。
ともあれちゃんとソースコードを当たる、というのは重要ですし意外に難しいことが書いてあるわけでもない、というのは体験しておくべきですね。