Edited at

RailsでのCSVデータ投入


CSVデータの登録

開発の現場では大量のデータを取り扱うため、ExcelでCSVデータを作成し、それをデータベースに一気に投入するという方法がよく使用されています。汎用性の高い技術なので、ぜひ自分で実装できるようにしましょう。

新規に以下の名前のアプリを作成しましょう。

rails new csv_data

次に、データ投入のコードを記述するためのmodelを作成します。

rails g model data_test

modelと同時に作成されたマイグレーションファイルを、以下のように編集しましょう。今回は、name,age,addressの3つカラムを作成し、データ投入を行います。そのため、nameをstring、ageをinteger、addressをstringで作成します。

class CreateDataTests < ActiveRecord::Migration[5.2]

def change
create_table :data_tests do |t|
t.string :name
t.integer :age
t.string :address
t.timestamps
end
end
end

マイグレーションファイルを実行し、データベースにテーブルを作成します。

bundle exec rake db:migrate

lib/tasks/import.rakeにCSVデータをインポートするためのコードを追記します。

require 'csv'

# rake import:users
namespace :import do
desc "Import useers from csv"

task users: :environment do
path = File.join Rails.root, "db/csv/csv_data.csv"
puts "path: #{path}"
list = []
CSV.foreach(path, headers: true) do |row|
list << {
name: row["name"],
age: row["age"],
address: row["address"]
}
end
puts "start to create users data"
begin
User.create!(list)
puts "completed!!"
rescue ActiveModel::UnknownAttributeError => invalid
puts "raised error : unKnown attribute "
end
end
end

次に、データを投入するためのCSVファイルを保管するディレクトリを作成しましょう。dbディレクトリの中にcsvディレクトリを作成し、その中にCSVファイルcsv_data.csvを用意します。CSVファイルは初回配布データからコピー&ペーストで配置しましょう。CSVファイルには以下のような記述がされています。

name,age,address

hogehoge1,11,hogehoge1
hogehoge2,22,hogehoge2
hogehoge3,33,hogehoge3
hogehoge4,44,hogehoge4
hogehoge5,55,hogehoge5

以下のコマンドを実行

rake import:users

これでデータベースへの登録ができれば、実装は完了です。