開発途中のアプリケーションをローカル環境に入れるメモ
今回は、誰かが開発している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 ダンプ、復元のコマンド IT Tips
mysql -u ユーザ名 -p DB名 < ダンプファイル名
レコードでなく、スキーマのみをdumpする場合は「d」オプションを使います。
では、実際にdumpをします。
mysqldump -d -u hoge_remote -p hoge_development > hoge_dump.sql
実際は、このコマンドはコピーしたいアプリケーションのサーバー上で行うか、「h」オプションで、ホストサーバーを指定してdumpすることになります。
dumpしたら、それを流し込みます。
これで、ローカルに同じスキーマをもったデータベースができます。
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