れさくのブログ

れさくのブログ

*

マイグレーション~DB構造の変遷を共有する

   

laravel
PHPファイルをローカルで作業してテストして、gitでcommitする。
これは分かる。

じゃあDBをいじった時はどうするんだろう?
新しいテーブルを作ったり、カラム追加削除したり、index追加したり。。。
この情報をどうやって開発チーム全体で管理しよう?

!ピコーン!
DB丸ごとdumpしてcommitしよう!(提案)

一体何ギガのファイルをgitで管理するつもりなんですかね・・・(却下)

そんなときはmigration。
マイグレーションを使いましょう。

マイグレーションはDB構造の変化を記録するものです。

新しいテーブルを作ったり、カラム追加削除したり、index追加したり。。。

そんな歴史が一元管理されます。

「新しいテーブルを作ったり、カラム追加削除したり、index追加したり。。。」の一つ一つのやり取りが、一つ一つPHPファイルとして記録されるのです。

つまりこれをgitで共有すれば、新しくチームに入った人のローカルにも、全く同じDBを構築できるのです。
ポイントは「現在の最新のDBがいきなり作られる」のではなく、「新しいテーブルを作ったり、カラム追加削除したり、index追加したり。。。」という歴史が高速で再現されて、その結果「現在の最新のDBが作られる」のです。

「なんで?いきなり最新のDB作っちゃえばいいじゃん」と思うかもしれませんが、他のメンバーが今まで作業してきた過程をちゃんと経ることで結果に至るのは、gitの履歴と同じくらい重要なのです。

「胎児は生命進化の過程を超高速で再体験している」という例の話で考えれば理解しやすいと思います。
(かえって分かりにくいー!)


で、マイグレーションってどうやるの?

まずマイグレーションファイルを作って、そのファイルにDBをどうこうする命令を書きこむの二段階作業です。

まずマイグレーションファイルを作る。
php artisan migrate:make
これが基本コマンド。

使い方はこんな感じ。
php artisan migrate:make わかりやすい名前

わかりやすい名前とは、例えばどこかのテーブルのカラムにindex貼りたい場合は、こんな感じです。

[add]_[index付けたいカラム名]_[index]_[to]_[テーブル名]

つまりこうなります。

php artisan migrate:make [add]_[index付けたいカラム名]_[index]_[to]_[テーブル名] --table=[テーブル名]

具体例。
ekikore_userというテーブルのstation_cdというカラムにindexを貼る場合は、こう。

php artisan migrate:make add_station_cd_index_to_ekikore_user --table=ekikore_user

これによって、先ほどの「分かりやすい名前」の前にタイムスタンプの付いたファイルが自動的に作られます。

作られる場所は、このあたり?
app ▸ database ▸ migrations

今回はこんなファイルができました。
2015_02_16_114748_add_station_cd_index_to_ekikore_user.php


次に二段階目の作業。
できたマイグレーションファイルは、すでに雛形のコードが書かれています。
ここにDB構造を変える命令を書き込みます。

up()はDBに対して行った変更の内容を書きます。

down()は逆に、変更前の状態に戻すための処理を書きます。

php artisan migrate
という呪文を唱えると、up()が実行されます。
溜まっていた数多のマイグレーションファイルが続々と実行されます。
これまでDBに対して行われた歴史が、超高速で展開されます。
メイド・イン・ヘブンッ!

逆に時間を逆戻しにして人生やり直したければ、これ。
php artisan migrate:refresh --seed
バイツァ・ダスト!

あれ?migrate:refreshってLaravel4では使えなかったかもしれない。


ちなみにindexの名前はどうやって決めるかというと、
[テーブル名]_[カラム名]_[index]
です。

例えば今回の例なら
[ekikore_user]_[station_cd]_[index]
なので
ekikore_user_station_cd_index
となります。

全然関係ないけど、WordPressってコード書くのに適したプラグインとか無いのかな?
見にくくて仕方ない。
HTMLソースベタ書きにしてみる?

 - Laravel

adpc

adpc

Message

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  関連記事

MBAにLaravelな開発環境を構築してみる(前編)

Laravelを使います。 今世界中で注目されているフレームワークです。 まず響 …

mysql
MySQLをチューニング3:MySQLの設定見直す

データベースが重いからMySQLをチューニングするに書いた四天王の三人目「MyS …

mysql
dumpした大容量sqlファイルでDBを構築-IT版本当にあった怖い話(レベル8)

途中までは、よくある話。 「dumpしたsqlファイル送るからそっちのローカルに …

TJCT!プロセスの暗殺教室

ブラウザ上で巨大なデータを扱ったら、応答が返ってこない・・・・ ブラウザを閉じた …

MBAにLaravelな開発環境を構築してみる(後編)

-これまでのあらすじ- php -v 「ワタシハPHP5.5デス」 phpinf …

MBAの英字キーボードをKarabinerで使いやすくする

れさくさんの貧弱なMBAを見かねて、MBAが貸与されました。 なんとメモリは2倍 …

MBAにLaravelな開発環境を構築してみる(中編)

-これまでのあらすじ- パルチザンが環境構築を終えてサーバ起動したらエラーになっ …

mysql
コマンドラインでMySQLを操作するまとめ(復習)

phpMyAdminなどで運用中心にやっているとコマンドラインを忘れがち。 なの …