Railsでマスタデータをロード(インポート)するためのrakeタスクを作ってみた

(注)動作確認はRails2.0.1
設定データやテストデータをテーブルへ流し込むために、今まではDB側の機能を使っていたのですが(load data infileとか)、少々面倒くさくなってきたのでAWDwR(2版)を調べて見たところ、p252あたりにデータロードに関する記述を見つけました。ただ、これはマイグレーションの利用が前提になっているみたいで、普段migrationを使っていない私には運用的に少々難しそうです。そこで本の内容を参考にrakeタスクを作ってみました。

  1. lib/tasks/load_master_data.rakeを作成
  2. lib/tasks/master_dataにcsvまたはymlのデータファイルを突っ込む
  3. rakeタスク実行

と言う手順です。

rakeタスクファイル作成

railsアプリのlib/tasksにload_master_data.rakeという名前のファイルを以下の通り作ります。ActiveRecordの接続設定だけ、自分の環境に合わせてください。


# rails_app/lib/tasks/load_master_data.rake

require '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タスク実行

以下のコマンドを実行します。


rake load_master_data
これでデータがロードされていることを確認してください。テーブルと同じ名前のcsvなりymlなりをmaster_dataにポコポコ置いていくだけで良いので実に手軽です。