目的
railsにcsvデータをインポートする。バルクインサートで一度に複数のデータを追加したい。定期的に行いたいがここでは自動化せず手動で。
仕様
rails 5.1.4
db postgres
サーバー heroku
CSVメソッドについて
ここにCSVメソッドについてはまとめる
activerecord-importが便利そう
- 2つのモデル modelAとmodelBを作る
- modelBにmodelAを繰り返し処理でデータを入れていく
- modelBのデータを配列でまとめてimport arrayでインポート
- csvデータをdbフォルダ直下に置く
- rails consoleでimportを実行
下記をmodel/application_record.rbに記載。
import.rb
def self.simple_import(path: '', col_sep: ',')
a = []
CSV.foreach(path, headers: true, col_sep: col_sep) do |r|
a << self.new(get_import_params(r))
end
import a # activerecord-importのメソッドです。
end
private
def self.get_import_params(row)
headers = row.headers & self.column_names # 存在するカラム名のみに限定する
headers.each_with_object({}) do |c, h|
h[c.to_sym] = row.field(c)
end
end
railsconsoleにて下記をうつ
Post.simple_import(path: 'db/input.csv', col_sep: ',')
Post部分は対象のmodelに変換
herokuの場合
heroku run rails c
でconsoleを立ち上げて上記のコマンドを打つ