Ruby
Rails
PostgreSQL
CSV
初心者

csvデータをPostgreSQLのCOPYコマンドを使ってDBに取り込む(insert)方法

データを取り込む処理は既に実装されていたので最初はrails runnerを使ってたのだが、遅い。

処理が全然終わらないので、直接DBへ取り込む形に変更した。

rails runnerの場合

> rails runner hogehoge.rb

DBへ直接取り込む場合(COPY)

COPY shop_sales (sales_date,shop_id,sales)
FROM '/Users/taku/hogehoge.csv' with csv;

すげー簡単。ビックリ。
でも、何よりビックリしたのが、バカみたいに早い。
うん時間かかっていたのが、数秒で終わっちゃう。

はまった所としては、最初idのカラムを作ってしまっていたのだがRailsでは自動で採番してくれるようになっているので不要だった。

まとめ

お互いメリット、デメリットがあって基本的にはやっぱり既存のコードを使う方が良い。
何故ならデータにミスがあってもバリデーションが働くから。

それに対して直接取り込む場合は、それが無いので

  • nil それとも 0 ?
  • 日付は正しい形式になってる?

などなど本当に正しいデータ形式なのかしっかり確認しておかないと思わぬ障害を作ってしまう。

なので、既存のコードでsaveされる直前のデータを確認しcsvデータが同じ形式になっているかをチェックするようにしました。

そんな感じ。