はじめに
会社でエンジニアをやっていると、データベースからこんなデータをちょうだい!と他の部署から依頼されるケースがあります。データを欲しがるのはだいたい営業やマーケティングの部署なので、エクセルで開くため出力形式はCSVです。
postgresからクエリの結果をCSVへ出力するとき、psqlのCOPY TOを使ったりRailsのActiveRecordなどのORマッパを経由したりするケースが多いと思います。ぼくもずっとそうやってきましたが、あるときふとEmbulkが使えるのでは?と思いつきました。
Embulkは、プラグインでの拡張のしやすさが特徴のバルクローダです。https://github.com/embulk/embulk
自分は、Postgres <=> Mysql間でデータをバッチで同期させたりするのに使っていました。Fluentdの兄弟みたいなもので、Fluentdがストリーミングデータを扱いEmbulkがバルクデータを扱う、というような棲み分けになっています。
下記のようなymlファイルを作って、embulk run config.yml
するだけ。これだけでも毎回psqlコマンドを使うよりはマシな感じになります。
#config.yml
in:
type: postgresql
host: your-host
user: your-user
password: your-password
database: your-database
query: |
SELECT id AS user_id
FROM users
WHERE age > 20
out:
type: file
path_prefix: ~/tmp/csv_out
file_ext: csv
formatter:
type: csv
charset: UTF-16
メリットとしては、
- yamlファイルとしてクエリがリポジトリに蓄積できる。psqlでやっていると、いちいち前に投げたクエリを覚えておく気にならない。
- DBの情報とクエリをセットにしておける。
- 並列実行など、Embulkの便利機能が使える。
- DBがMySQLに変わったり、他の形式で出力しなければいけないときも怖くない。
あたりでしょうか。
ひとこと
今はクエリを設定ファイルの中に直接書いてしまっているけれど、クエリの定義ファイルを別に作り、実行するときにクエリを柔軟に組み合わせたりなどしてみたいと思っています。
DBからCSVへの出力って、部門間のデータの受け渡しでけっこうやる機会があるけれど、なんとなくpsqlを使っているケースは多いのでは?Embulkを使うのは意外と盲点なんじゃないでしょうか。どこまで実用に耐えるか、しばらく使ってみたいと思います。