rake db:seedを使った初期データの投入

広告

Railsアプリケーションでテーブルやモデルなどの準備が出来たあと、初期データをテーブルに追加する方法を解説します。テストを行なうためのサンプルデータを追加したり、顧客データなどの既に用意されているデータを事前に追加しておく場合などに使います。

1.個別データの追加
2.大量のサンプルデータの追加
3.CSVを読み込んでデータを追加

初期データを追加する方法は直接データベースにアクセスして追加することもできますが、今回はRailsで用意されている仕組みを使います。では「db/seeds.rb」ファイルを見て下さい。

p10-1

このファイルはRubyを使って記述されたスクリプトファイルです。このファイルの中にデータを追加するためのスクリプトを記述し実行することでデータを追加します。

ではファイルをテキストエディタで開いて下さい。

# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples:
#
#   cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
#   Mayor.create(name: 'Emanuel', city: cities.first)

現在はコメントだけ記載されています。ではスクリプトを記述していきます。

今回データを追加するテーブルに対応したモデルのクラスであるTitleクラスで、クラスで用意されているクラスメソッドであるcreateメソッドを使ってデータを追加していきます。

モデルクラス名.create(:カラム名1 => 値1, :カラム名2 => 値2, ...)

今回は次のように「db/seeds.rb」ファイルに次のように記述しました。

# coding: utf-8

Title.create(:name => '観察日記', :sales_date => '2011-11-14', :price => 1000)
Title.create(:name => 'Simple Life', :sales_date => '2012-02-08', :price => 2300)
Title.create(:name => 'メガネ入門', :sales_date => '2011-10-25', :price => 800)

※ 日本語を使用する場合はファイルの先頭に「# coding: utf-8」を忘れないようにして下さい。

スクリプトファイルを作成したら、次のコマンドを実行して下さい。

rake db:seed

これで先程記述したスクリプトが実行され、テーブルに初期データが追加されます。では実際に行なってみます。

p10-2

スクリプトが実行され3つのデータが追加されました。ではMySQLに接続してテーブルのデータを参照してみます。

p10-3

スクリプトに記述したデータがテーブルに追加されちることが確認できます。

先程は追加するデータを1つ1つ追加しましたが、テスト用にサンプルデータをとにかく多く追加したい場合もあります。そのような場合、「db/seeds.rb」ファイルはRubyで記述されたスクリプトですので任意のスクリプトを記述してデータを追加することができます。

今回は例として「db/seeds.rb」ファイルを次のように書き換えました。

# coding: utf-8

5.times do |no|
  Title.create(:name => "タイトル #{no}")
end

ダブルクオーテーションで囲まれた文字列の中で #{変数} と記述すると変数の値が文字列の中で展開されます。

では先程と同じく次のコマンドを実行して下さい。

rake db:seed

p10-4

スクリプトが実行されデータが追加されました。ではMySQLに接続してテーブルのデータを参照してみます。

p10-5

新しいデータが5つ追加されていることが確認できます。

自動で作成されるデータではなく、顧客一覧のような作成済みのデータや郵便番号一覧などの参照用データなどあらかじめ用意されたデータを読み込みたい場合もあります。例としてCSVで用意されているデータを読み込んでテーブルに追加する場合も試してみます。

RubyでCSVデータを読み込むには次のような記述を行ないます。

require "csv"

CSV.foreach('db/sample.csv') do |row|
  Title.create(:name => row[0], :sales_date => row[1], :price => row[2])
end

上記内容を「db/seeds.rb」ファイルに記述しました。CSVファイルへのパスは、アプリケーションのルートからの相対リンクで記述して下さい。

また読み込むデータとして次のようなファイルを用意します。

火星探検, 2009-12-01, 1100
Map Fun, 2011-02-24, 700

CSVファイルは「db/sample.csv」として保存しました。

p10-6

では今までと同じく次のコマンドを実行して下さい。

rake db:seed

p10-7

スクリプトが実行されデータが追加されました。ではMySQLに接続してテーブルのデータを参照してみます。

p10-8

CSVに記載された2つのデータが読み込まれテーブルに追加されていることが確認できます。

( Written by Tatsuo Ikura )