[Ruby on Rails]CSVファイルを使い、データを一括でDBに読み込ませる方法


はじめに

seed内でデータを作成するのが面倒だったので、Excel(Numbers)でデータを作成し、一括でDBに読み込ませる方法をまとめました!

【環境】
私はMacを利用しているので、初期搭載されていて、無料で使えるNumbersを使用。
(重複セルを見つけい場合や複雑な処理はExcelを使用。)

使い方

CSVファイルを作成

  1. 1行目にキーとなる任意の名前をつける。(対応するDBの項目名と同じにすると分かりやすい)
  2. 2行目以降にデータを打ち込む。

3.データを作成したら ファイル → 書き出す → CSVを選択

4.案内に沿って、次へ

5.ファイル名(任意)と保存先(任意)を指定して書き出す

seedファイルの準備

先ほど作成したファイルをDBディレクトリの中に置く

seedファイルの編集

db/seeds.rb
require "csv" #csvファイルを読み込む為に記載

#movieをcsv経由で追加する
CSV.foreach('db/movies.csv', headers: true) do |row|
#'db/movies.csv'←先ほど作成したCSVファイルのパスを指定
# headers: true ←Numbersファイルの先頭行を読み込む
  Movie.create( #データ挿入先のテーブル名を指定
    title: row['title'],
    #title:←テーブルの項目名を指定
    #row['title']←対応するNumbersファイルの先頭行を指定
    release: row['release'],
    production: row['production'],
    screening_time: row['screening_time'],
    genre: row['genre'],
    status: row['status'],
  )
end

seedファイル読み込み

ターミナルで rails db:seed を実行

rails db:seed

コマンドを実行したら、rails c で結果を見てみよう!

上手くDBにデータが入らない場合は以下を試してみてください!

  • CSVファイルを開いてみて、1行目にキーとなる任意の名前が記載されているか、間違いがないか確認する
    (1行目にシートの名前、2行目にキーが記載されている場合がある)
  • rails db:migrate:resetrails db:migraterails db:seed でリセットをかけてみる
  • CSVファイルの記載する項目名の順番と、DBの項目定義の順番を合わせてみる
    例. DBの項目定義順が title, release, production,...なら
    CSVの記載項目順も title, release, production, ...にする
    (私の場合これで上手く入るようになりました。)

以上となりますが何か間違った情報など提供してましたらコメント欄でお伝えください!

参考
【Rails】rake seedコマンドでCSVファイルからDBに読み込ませる方法