Railsでマスタデータをロード(インポート)するためのrakeタスクを作ってみた
(注)動作確認はRails2.0.1
設定データやテストデータをテーブルへ流し込むために、今まではDB側の機能を使っていたのですが(load data infileとか)、少々面倒くさくなってきたのでAWDwR(2版)を調べて見たところ、p252あたりにデータロードに関する記述を見つけました。ただ、これはマイグレーションの利用が前提になっているみたいで、普段migrationを使っていない私には運用的に少々難しそうです。そこで本の内容を参考にrakeタスクを作ってみました。
- lib/tasks/load_master_data.rakeを作成
- lib/tasks/master_dataにcsvまたはymlのデータファイルを突っ込む
- rakeタスク実行
と言う手順です。
rakeタスクファイル作成
railsアプリのlib/tasksにload_master_data.rakeという名前のファイルを以下の通り作ります。ActiveRecordの接続設定だけ、自分の環境に合わせてください。
# rails_app/lib/tasks/load_master_data.rakerequire 'active_record'
require 'active_record/fixtures'# dbへの接続
ActiveRecord::Base.establish_connection(
:adapter => 'mysql',
:database => 'your_db',
:username => 'your_name',
:password => 'your_pass',
)# master_dataディレクトリ内のファイル名を取得
@@files = []
@@directory = File.join(File.dirname(__FILE__), "master_data")
Dir.foreach(@@directory) do |f|
@@files << File.basename(f, ".*") if File.file?(File.join(@@directory, f))
end# ファイル名からActiveRecordクラスを定義
@@files.each do |c|
eval("class #{c.singularize.camelize} < ActiveRecord::Base; end")
end# fixtureでデータをロードするためのクラス
class LoadMasterData < ActiveRecord::Migration
def self.up
down
Fixtures.create_fixtures(@@directory, @@files)
end
def self.down
@@files.each do |c|
eval("#{c.singularize.camelize}.delete_all")
end
end
end# rakeタスク
task :load_master_data do
LoadMasterData.up
end
データファイル作成
次にlib/tasksにmaster_dataというディレクトリを作成します。
ディレクトリができたらデータファイルを突っ込みます。
cd rails_app/lib/tasks
mkdir master_data
- (テーブル名).csvまたは(テーブル名).yml
と言う名前でファイルを作ります。データファイルの内容はフィクスチャの場合と同様です。例えば都道府県データならprefectures.csvを
というように作ります。
id, name
1, 北海道
2, 青森
3, 岩手
・・・
45, 宮崎
46, 鹿児島
47, 沖縄
rakeタスク実行
以下のコマンドを実行します。
これでデータがロードされていることを確認してください。テーブルと同じ名前のcsvなりymlなりをmaster_dataにポコポコ置いていくだけで良いので実に手軽です。
rake load_master_data