マイグレーション関連のRakeタスクの再確認

Rails 2.1になってマイグレーション周りで追加されたタスクや覚えておくべきタスクについての確認。

追加された
  • db:migrate:up
  • db:migrate:down
覚えておいた方がよくなった
  • db:rollback
  • db:migrate:redo
  • db:abort_if_pending_migrations

追加された – 各マイグレーションのupとdownを任意に実行できるように

2.1からRakeタスクに「db:migrate:up」と「db:migrate:down」が追加された。
これにより各マイグレーションのupとdownが好きなタイミングで任意に実行できるようになった。

それぞれupとdownを実行したいVERSIONを指定して実行する。14桁。めんどくさくてもちゃんと指定する。指定しなくてはならない。

 $ rake db:migrate:up VERSION=200806010112
 $ rake db:migrate:down VERSION=200806010112

このdb:migrate:upやdb:migrate:downの実行はマイグレーションのバージョン管理テーブルに記録されない。
例えば新しいマイグレーションファイルを作ってその内容をdb:migrate:upで実行した後にdb:migrateするとフツーにまた実行される(そして多分エラーになる)
つまりdb:migrateやdb:rollbackの変わりになるものではないので注意。

なので恒久的な変更をdb:migrate:upやdb:migrate:downで行うのはやめておいた方がよい。
それだけ念頭に置いておけば便利に使える場面はありそうだ。

ひとつのマイグレーションにつきひとつの変更、あるいは関連するひとまとまりの変更のみを扱うようにしておけばupやdownしやすくていいかもしれない。
個人的にひとつのマイグレーションであれもこれもいろいろとやってしまう傾向があるのでこれを機に改めようかしらん。

覚えておいた方がよくなった – バージョン番号14桁時代に向けて

バージョン番号が長たらしくなったので、2.0から追加されていたタスクの中にもいくつか覚えておきたいタスクが増えた。
db:rollbackとかdb:abort_if_pending_migrationsとか。

rake db:migrateだけで生きていけた時代は終わりを迎えつつあるようだ。

db:rollback

DBの状態を以前のバージョンに戻すタスク。
rake db:migrateで以前のバージョンを指定したときと同じように動作する。

デフォルトでは一つ前のバージョンに戻る。
STEPでバージョンをいくつ戻すか指定できる。

 $ rake db:rollback
 $ rake db:rollback STEP=3
 $ rake db:rollback RAILS_ENV=production
 ※ rake db:migrate:rollbackではないので注意

このタスクを知らないとrake db:migrateのVERSION指定で戻すしかないが、バージョン番号が14桁になった今それはかなり鬱な作業となった。
なので覚えておきたい。

db:migrate:redo

マイグレーションのやり直しを行うタスク。
オプションなしで実行するとバージョンをひとつ戻して再適用する。

動作としてはdb:rollbackした後db:migrateするというもの。
実際単純にdb:rollbackとdb:migrateを続けて呼び出してるだけなので、途中のバージョンでredoした場合も最後のバージョンまでマイグレーションが進んでしまうので注意。
STEPやVERSIONなどそれぞれ指定可能。

このタスクが活躍するのは主に開発中かな?

 $ rake db:migrate:redo
 $ rake db:migrate:redo STEP=3
 $ rake db:migrate:redo STEP=3 VERSION=200806060112

これはそんなに重要じゃないと思うけど一応知ってたらちょっと楽。

db:abort_if_pending_migrations

適用されていないマイグレーションを確認するタスク。
実行した時にすべてのマイグレーションが適用済みであれば何も出力せずに終わるが、適用されていないものがあると次のように出力する。

 $ rake db:abort_if_pending_migrations
 (in /tmp/akahige/test_2_1)
 You have 1 pending migrations:
   20080606132820 Hogehoge
 Run "rake db:migrate" to update your database then try again.

マイグレーションの状況を確認したいときにはバージョン番号を見て判断するよりこちらでやるのがいいだろう。
仕組み的にバージョン番号だけでは適用されていないマイグレーションを判断できなくなったというのもあるが、それでなくてもタイムスタンプのバージョン番号とか正直見間違いしそうだし。

例えばdb:versionで確認しても

 $ rake db:version
 [22:30 root@daifuku] # rake db:version                                                                                                              [/tmp/akahige/test_2_1]
 (in /tmp/akahige/test_2_1)
 Current version: 20080605145748

やっぱりバージョン番号が長すぎてパッと見わかりにくい。
タイムスタンプのシリアル番号は便利だけど見やすいものではないですな。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

  1. […] マイグレーション関連のRakeタスクの再確認 – ひげろぐ 新たなるrakeタスク db編 – 吉見和也(Kazuya Yoshimi) – ZDNet […]

トラックバック URL