既存のDBとRailsを組み合わせて使う(1)〜開発用 データベースを作る
すでにDBがあって,データもそこそこ入っている状況で,そのDBを使うRailsアプリを作りたい。テーブル構成はシンプルで,メインのテーブルが数個のテーブルを(1:1で)外部参照しているだけ。ただ,このメインテーブルにはRails必須のidカラムが無い。idとして使っているカラムはあるが整数でもない。うーん。とりあえず稼働中といってもまだ公開しているわけじゃないので,一度ダンプして,カラムにシリアル型のidを追加してリストアした。
せっかく既にDBがあるんだから,development用に同じストラクチャのテーブルを手作業で作るのは面倒くさい。
- とりあえずDBだけは作った(artonさん本の db_setup.rake が便利)
- database.yml を編集して,production は稼働中DBに合わせた。
rake environment RAILS_ENV=production db:schema_dump
これでスキーマがダンプされる。これを migrate のスクリプトにそのまま使おう。
ruby script/generale model Member
とモデルを作ると(ただし罠あり。次項を参照),db/migrate の下に 001_create_members.rb というファイルができるので,その中にさっき作ったスキーマのファイルからコピペ。各モデルごとにこれを繰り返す。マイグレーションする前にもう1つ問題が。
メインのデータベースには id カラムを追加したけど,他のテーブルには無い。でも「id」って名前じゃないけど整数のプライマリーキーは付いているので,それをそのまま使いたい。こんな感じでマイグレーションファイルに追加。
options = { :primary_key => "job_id" } create_table :job_master, options do |t| t.column "name", :string, :null => false end
最後に
rake migrate
すれば同じテーブル構成ができる。もっと簡単な方法があったら教えてほしい。なにか便利な rake タスクがあるのだろうか(rake -T でタスク一覧がでます)。
ここまでくると,production(つまり稼働中の)データベースからdevelopmentにデータを持ってくるのも自動化したい。けどこれも簡単な方法が分からなかったので,DB固有のダンプ&リストアを使った。lib/tasks配下にrakeのタスクを書けば何かいいことがあるだろうか。これも便利なタスクが既にあるのかな。
カラム名なんか Rails 流に直したくなるけど,面倒になりそうのでぐっと我慢。