概要
Embulkで処理を作成する際、DB接続情報などの環境によって変更したい設定をどう定義すればいいか調べた内容をメモしておきます。
Embulkのテンプレート機能を利用する
Embulkに搭載されているテンプレートエンジンLiquidの機能を使って共通化してみます。
※ Embulk 0.7.7以上
ファイル構成
ファイル一覧
│ # 設定情報
├ _env.yml.liquid
│
| # bundle plugin.
├ bundle
│ ├ .bundle
│ ├ .ruby-version
│ ├ Gemfile
│ ├ Gemfile.lock
│ ├ embulk
│ └ jruby
│
│ # 処理内容
└ users.yml.liquid
設定情報
設定ファイルを作ってみる。
_env.yml.liquid
{% assign my_host = '127.0.0.1' %}
{% assign my_database = 'fuga_db' %}
{% assign my_user = 'hoge' %}
{% assign my_password = 'test' %}
処理に組み込んでみる
実際に、上記設定を組み込んで実行してみる。
users.yml.liquid
{% include 'env' %}
in:
type: mysql
host: {{ my_host }}
user: {{ my_user }}
password: {{my_password}}
database: {{my_database}}
query: |
SELECT
id, name, created_at
FROM
users
WHERE
deleted_at IS NULL
LIMIT
5
;
out:
type: file
path_prefix: "./users_"
file_ext: csv
formatter:
type: csv
delimiter: ","
newline: CRLF
newline_in_field: LF
charset: UTF-8
quote_policy: MINIMAL
quote: '"'
escape: "\\"
null_string: "\\N"
default_timezone: 'Asia/Tokyo'
プレビュー
ターミナル
$ embulk preview -b bundle users.yml.liquid
実行
ターミナル
$ embulk run -b bundle users.yml.liquid
まとめ
テンプレートエンジンLiquidの機能を使った場合、includeはサブディレクトリには、
対応しているが、「../」のように上の階層を指定するとエラーになることから、階層分けには不向きのようです。
例)
ファイル一覧
│ # 設定情報
├ _env.yml.liquid
├ try1
│ └ config.yml.liquid <- include '../env' (×)
├ try2
│ └ config.yml.liquid <- include '../env' (×)
├ try3
│ └ config.yml.liquid <- include '../env' (×)
・
・
・
└ users.yml.liquid <- include 'env' (○)
下記のように1つの階層で構成するには向いているようです。
例)
ファイル一覧
│ # 設定情報
├ _env.yml.liquid
├ try1.yml.liquid <- include 'env' (○)
├ try2.yml.liquid <- include 'env' (○)
├ try3.yml.liquid <- include 'env' (○)
・
・
・
└ tryN.yml.liquid <- include 'env' (○)