joppot

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

プログラミング

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

投稿日:

Pocket

reg9ag

概要

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

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

前提

railsの環境が整っている

SPONSORED LINK


テスト用のモデルを作る

それではテスト用のカラムを作り、そこで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

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

関連記事

macにmiddlemanの環境構築をする

概要 みなさんこんにちはcandleです。今回はmacにmiddlemanの環境構築をしてみたいと思います。 middlemanといえばwebサイト作成支援ツールみたいなものです。 githubやhe …

railsのmodelで各データが何個あるかカウントする

概要 皆さんこんにちはcandleです。 今回は、railsでレコードのデータそれぞれ何個あるのか数える方法を紹介します。 mysqlだと簡単なのですが、railsだとよくわからなかったので、いろいろ …

Mysqlで今日以降の最も近い日付を取得する

概要 みなさんこんにちはcandleです。今回はmysqlで今日以降の最も近い日にちを取得する方法を紹介します。 ライブや、イベントなどで、今日から見て、最も近い日のデータを取得したみたいなことってあ …

Chart.js 2.0でy軸の最大値(scales max)と最小値を設定する

概要 みなさんこんにちはcandleです。今回はChart.js2.0でy軸の最大値、最小値を設定する方法を紹介します。 Chart.js 2.0では特に指定しないと自動的に、y軸の最大値を設定してく …

ruby on railsのデータベースのテーブルにカラムを追加、削除する

概要 みなさんこんにちはcandleです。今回はrailsのカラムの追加の仕方を紹介します。 本当にrailsは規約が多くて、多くて、なんでデータベースを直接いじれないんだと。 早速やっていきましょう …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ