rake db:reset が本当はイチからDBを再構築してなかった話
明けましておめでとうございます。という挨拶はほどほどに、今日の気づきを。
どこかで rake db:reset
は、以下のコマンドの省略であると教えてもらった。
rake db:drop
rake db:create
rake db:migrate
rake db:seed
そう信じていた。
なんならログも
Dropped database 'hoge_development'
Dropped database 'hoge_test'
Created database 'hoge_development'
Created database 'hoge_test'
-- create_table("customers", {:options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8", :force=>:cascade})
-> 0.0453s
create Customers
みたいにそれっぽいのを出力していた。が、違うことが判明した。
def change
add_column :users, :role, :int
end
こんな感じのmigrationをgenerateで作ったとする。で、これを試しに実行する。うまく行ったのをみて、
def change
add_column :users, :role, :int, null: false, default: 0, after: :email
end
こんな感じに書き換えた。で、 rake db:reset
をする。当然、イチから作るものと思っている僕は、属性も順番も指定の通りに書き換わると思ったら、そうなっていないのだ。
書き方が間違っていたのかと四苦八苦していたが、試しに rake db:reset
ではなく、
rake db:drop
rake db:create
rake db:migrate
rake db:seed
を個別に実行したところ、期待どおりの動きになった(書き方あってるやろがい!)。
どうもRailsくんは、migration番号(ファイル名についてる数字で、DBにも書き込まれてる)などを信頼して、省エネで再構築した風にみせているようだ。
これ以上は深入りすると火傷しそうなのでやめておく。
とりあえず
rake db:drop && rake db:create && rake db:migrate && rake db:seed
をスニペット登録して、これ使おう。
2019-01-09追記
rake db:reset
でみているのは、 schema.rb
という指摘をいただいた。なるほど! schema.rb
くん、そういうときに活躍するんやな…なんやこいつって思ってた…
qiita.com/hirohero/items/2f29334878b0cb525bda
によると、
db:drop
db:create
db:schema:load
の省略らしいです。 db:schema:load
……そういうのもあるのか。
ディスカッション
コメント一覧
まだ、コメントがありません