seed-fuとは何か
DBに初期データを投入するための仕組みとして、Rails(ActiveRecord)にはdb:seed
というrakeタスクが用意されています。
このrakeタスクには冪等性がないため、実行するたびに新たなレコードが登録されます。そのため、変更が想定されるデータにおいてはdb:seed
で投入する際に工夫が必要となります。
その煩雑さを解決する手段として登場するのが、seed-fuです。seed-fuでは更新されたレコードのみを操作します。つまり、値が変わったレコードはUPDATE
され、追加されたレコードはINSERT
されます。
Sinatraで使う方法
この便利なseed-fuですが、Sinatraとの組み合わせで使う場合にひと手間必要となります。
Rails上での使用が前提とされているため、Sinatraにおいては自前でrakeタスクを定義する必要があります。
以下のRakefile
をルートディレクトリに配置します。
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
require 'seed-fu'
namespace :db do
task :seed_fu do
SeedFu.seed
end
task :load_config do
require './app/app' # FIXME ActiveRecordの設定を行っているファイルを指定します。環境に合わせてパスを修正してください。
end
end
Rake::Task['db:seed_fu'].enhance(['db:load_config'])
これによりrake db:seed_fu
を実行できるようになります。
参考リンク
mbleigh/seed-fu - GitHub
sinatra-activerecord で seed_fu を使ってみた