開発途中のアプリケーションをローカル環境に入れるメモ

今回は、誰かが開発しているRails アプリケーションを、自分のローカルで起動まで持っていくために必要な手順を書きます。
ただ、マイグレーションファイルがあったり、rake db:setup で全部できちゃう(アプリケーションのDBセットアップをするためのRaketaskファイル(setup.rake) - @luke_silvia.diary)という状態だと面白くないので、以下の状況を想定します。(実際本日これをやりました)

  • 環境

マイグレーションが途中から始まっている。つまり、001 のファイルが以下のような状態。

  • 001_add_name_to_user.rb
class AddNameToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :name
  end

  def self.down
    remove_column :users, :name
  end
end


当然、この状態でrake db:migrate をやると、テーブルがないと怒られます。

手順

手順は3ステップです。

  • 1.データベース構造をdumpでコピーする
  • 2.schema_infoを調整する
  • 3.schema.rbに情報を流し込む

1.データベース構造をdumpでコピーする

dumpはMySQLでは以下のように行います。

ダンプを取る
mysqldump -u ユーザ名 -p DB名 > 出力先ファイル名

ダンプから復元する
mysql -u ユーザ名 -p DB名 < ダンプファイル名

MySQL ダンプ、復元のコマンド IT Tips

レコードでなく、スキーマのみをdumpする場合は「d」オプションを使います。


では、実際にdumpをします。

mysqldump -d -u hoge_remote -p hoge_development > hoge_dump.sql

実際は、このコマンドはコピーしたいアプリケーションのサーバー上で行うか、「h」オプションで、ホストサーバーを指定してdumpすることになります。
dumpしたら、それを流し込みます。

mysql -u hoge_local -p hoge_development < hoge_dump.sql


これで、ローカルに同じスキーマをもったデータベースができます。

2.schema_infoを調整する

Railsでは、マイグレーションのバージョン情報は、shema_infoテーブルがもっています。
このテーブルは次のスキーマを持ちます。

mysql> show columns from schema_info;
+---------+---------+------+-----+---------+-------+
| Field   | Type    | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| version | int(11) | YES  |     | NULL    |       |
+---------+---------+------+-----+---------+-------+


このversionがマイグレーションのバージョンを現しています。よって、dumpした結果を流し込んだデータベースは、マイグレーションのバージョンが細心でなければなりません。よって、最新のバージョン情報を入れてやります。マイグレーションファイルの最後のファイルが016_xxxになっているなら、次のようにしてversionに16を与えます。

mysql> insert into schema_info (version) VALUES(38);
Query OK, 1 row affected (0.01 sec)


ここで、rake db:migrate とすれば、何も起こらないで終了します。つまり、最新の状態になっているということです。

3.schema.rbに情報を流し込む

最後に、schema.rbに情報を流します。
このファイルには、マイグレーションの実行後に、すべてのDB定義がruby 形式で格納されます。
しかし、schema_infoの時と同様、rake db:migrateを行ったわけではないので、schema.rbファイルにDB定義を書き込んでやる必要があります。
これは、以下のコマンドによって一発でできます。

rake db:schema:dump

最後に確認

ここまでで、手動でDBを作成しましたが、マイグレーションで作成した状態と同じ状態になりました。
正常に移行が行われたか確認するために、以下の2つを実行して完了です。

rake db:migrate

rake