joppot

コピペで絶対動く。説明を妥協しない

プログラミング

railsのrakeで作成したmigrationファイルとstatus履歴を削除する

投稿日:


reg9ag

概要

みなさんこんにちはcandleです。今回はrakeコマンドで作成したマイグレーションファイルの管理を紹介します。rakeコマンドを使っていると、よくよく考えれば必要の無いファイルがある。とか重複しているとかで、マイグレーションファイルが嵩んでしまう場合があります。

それを整理する方法をやっていきましょう。

前提

railsの環境が整っている


テスト用のモデルを作る

それではテスト用のカラムを作り、そこでrakeコマンドのテストをします。
もしも、テスト用のカラムがある場合や、別にテストしなくても良い場合はそのまま進めてください。
railsプロジェクトの中で、下のコマンドを実行して、モデルを作成します。
私は例によって、bootstrap3というrailsプロジェクトを使います。

rails g model dbtest name:string description:text

createdbtesttable2

下のコマンドでマイグレーションファイルをデータベースに適応させます。

bundle exec rake db:migrate

これでdbtestモデルができました。

データベースを確認する

コマンドラインから、データベースにアクセスします。

rails db

まずはテーブルができているか確認します。
mysqlを使っているなら

show tables;

sqliteなら

.table

です。

checktdbtesttable3

ありました。次にカラムの型を確認します。

mysqlなら

DESC dbtests;

sqliteなら

.schem dbtests

です。

checkcolumndbtest4

準備が出来ました。

データベースに反映する前のマイグレーションファイルを削除する

それでは、テスト用のカラムを加えてみましょう。
マイグレーションファイルを作成します。

bundle exec rails g migration AddAgeToDbtests age:integer

addagecolumn

ここで、bundle exec rake db:migrateでマイグレーションファイルの構造をデータベースに読み込む前に、
rakeのマイグレーションの状態を確認しましょう。

bundle exec rake db:migrate:status

bootstrap3rakestatus

マイグレーションの履歴をみると、一番したの「Add age to dbtests」の状態はdownになっていますね。
downということはまだデータベースにマイグレーションファイルに書かれている内容が反映されてない事を表しています。

この段階でマイグレーションを間違って作ってしまった場合は普通にrmコマンドでマイグレーションファイルを削除すれば、自動的に履歴からも消えます。

例えば私の場合は下の様にして、ファイルを削除して、

delagemigrationfile

ステイタスを確認すると消えていますね。

09jff


データベースに反映した後の最新のマイグレーションファイルを削除する

それではbundle exec rake db:migrateで作成したマイグレーションファイルを読み込みます。

bundle exec rake db:migrate

rakeの状態を確認すると状態がupになっている事がわかります。

bundle exec rake db:migrate:status

latestmigrationup

bundle exec rake db:migrateで読み込んでしまった最新のマイグレーションファイルはrollbackして、
ファイルを削除します。

bundle exec rake db:rollback

このコマンドを打つってstatusを見ると、最新のマイグレーション履歴がdownになっています。

bundle exec rake db:migrate:status

backtoone

後は同じ様に、rmコマンドで最新のマイグレーションファイルを削除すれば問題ありません。

removecommand

rake db:migrate:statusでdownになっていれば、マイグレーションファイルを削除しても構わないということです。


複数前のマイグレーションファイルを削除する

バージョンを指定して、マイグレーションファイルを削除する

一番安全なのはこの方法でしょう。
まずは削除したいマイグレーションファイルのmigration IDを確認します。

bunlde exec rake db:migrate:status

checkdeleteversion

上の図を見ると分かるように、Migration ID 20141013154137は状態がupです。
これを削除するためにはdownにする必要があります。
そこで、下のコマンドを使います。

bundle exec rake db:migrate:down VERSION=downさせたいmigration ID

私の例だと

bundle exec rake db:migrate:down VERSION=20141013154137

すると、そのマイグレーションファイルがdownになります。

137downstatus

そしたら、rmコマンドでそのマイグレーションファイルを削除します。

私の場合ですと、下の様になります。

shellfall

statusを確認すると、うまくいっていますね。

allmigrationsuccess

どうでしょうか。

rollbackで戻りマイグレーションファイルを削除する

一番気をつけて欲しいのはrollbackを使って過去のマイグレーションファイルを削除するにあたり、
消したいファイルの間にあるマイグレーションファイルに書かれたカラムも一度消えてしまうので、
誤って戻ると不必要なカラムのデータも消えてしまいます。

もうこの方法は使わない方が良いかもしれません。
とにかく誤ってデータを消す危険性があります。

複数前のマイグレーションファイルに戻る場合は細心の注意をしてもどってください。
rollbackで複数ファイルを戻る場合は、バックアップをとっておくとよいでしょう。

例えば、ageカラムを作った後に、addressカラムを作って、しばらくしたら、ageカラムは不必要だったと気づく時ってありますよね。

getridof

そういう時も、rollbackで消したいマイグレーションファイルまで戻って、rmで削除して、
もう一度、rake db:migrateで読みこめば良いのです。

最新のマイグレーションから2個前なら

bundle exec rake db:rollback STEP=2

で戻れます。
rollbacktwosteps

downになっているのを確認して

twodown

ageのカラムが書かれているマイグレーションファイルを削除します。

32rwfef

もう一度statusで確認して

bundle exec rake db:migrate:status

noagecolumn

マイグレーションファイルを読みこめば、

bundle exec rake db:migrate

無事マイグレーションファイルを削除出来ました。
finisheeeee

まとめ

注意して欲しいのは、数ステップrollbackするとその間に書かれているカラムの情報も戻ってしまうので、あまりrollbackでは戻らんずにVERSIONを指定して任意のマイグレーションファイルだけを削除しましょう。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-プログラミング
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

MAMPのSQLiteManagerを使用してsqlite3データベースの作成とデータベースファイルの設置

概要 みなさんこんにちはcandleです。今回はsqliteデータベースをMAMPを使用して作成しましょう。 PHP5.3からsqlite3のクラスが充実して、mysqlを使用しなくてもsqliteで …

fabricでvagrantのデフォルトの秘密鍵を使ってサーバにアクセスする

概要 みなさんこんにちはcandleです。今回はfabricを使ってvagrant上のvmにアクセスする方法を紹介します。様々なサイトを閲覧すると、あまりvagrantのデフォルトの鍵を使用して、fa …

react0.14 + gulp + express + babelでReactのチュートリアル環境構築をする

概要 みなさんこんにちはcandleです。今回は、react0.14のnodeの環境構築をします。 react0.14はまだまだ、開発段階にあり、しばしば仕様変更が行われています。 0.13の時では使 …

railsのgonで別ページでリロード後turbolinksで移動したら変数がundefindする場合の対処

概要 (追記 2016/05/18 この方法を行うと、turbolinksで問題が起きました。 turbolinksで移動した回数だけ、javascriptが実行されてしまいました。 例えば、 < % ...

gitpythonでfirst commitする

概要 みなさんこんにちはcandleです。今回はgitpythonで、初めてのコミットをする方法を紹介します。 gitpythonでコミットは難しくないのですが、初めてのコミットは要領が違ったので、ま …

  • English
  • 日本語

ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー