dbt macro tips advent calendar 2022 day 19 - コンテキストの中の便利なもの
便利なデータ変換ツールである dbt の中のmacroに関するtipsを書いていく dbt macro tips Advent Calendar 2022 19日目です。
先日は hookの中身を深くほっていきました。
すると、ドキュメントにはないrender()
なるものを見つけました。
コンテキストにはまだまだ知らぬものが隠されているようなので見ていきたいと思います。
ということで、ドキュメントにあるなし関わらずコンテキストの便利なものを紹介していこうと思います。
なお、ドキュメントには無いものは、将来的に変わる可能性もあるので使う場合は要注意です。
コンテキスト
modules
こちらは、こちらはpythonでよく使う 時関係やiterator系のmodeulesをJinjaテンプレート上で使えるようにしたものです。 こちらはどこでも使えるようになっています。
dbt_version
set, zip
この辺は、tupleやlistの操作ですね。 2つのリストをマージしたり。unique化したり等でゴリゴリの操作をしたいときにお世話になります。
diff_of_two_dicts
こちらはドキュメントにはありません。
set,zipとにてますが、これは2つのdictの差をとってくれます。
局所的に便利なので、知っておくと良いかもしれません。
fromjson, tojson, fromyaml, toyaml
Jinjaテンプレート上で扱ってるものや、DBからクエリしてきたものをフォーマット指定して出力したいときにお世話になります。
dbt_invocation_id, run_started_at
dbt_invocation_idは実行ごとにUUIDを生成してくれます。
run_started_atはdbtの実行が開始された時刻ですね。
この辺は監査系のログを作るときにお世話になります。
flags,invocation_args_dict
これらは、dbtの実行コマンドが得られます。
特に invocation_args_dict はselector_nameまで取れるのがいいですね。
特定のselectorで実行しているときだけ特殊な処理をはさみたいみたいなmacroを作るのに便利です。
いわゆるconditional global hookってやつですかね。
config
皆様おなじみのconfigなのですが、実は実装を深堀りしていくとexecute phaseとparse phaseでは異なるConfigが渡っているということが見えてきます。
実は、 parse phaseではconfigにset
ができてしまうのですね。
コレは中々に、便利です。parse phaseならば呼び出されたmacroの中から、modelのconfigに任意の値を入れることができる。
更に、その値はexecute phaseならば、graphコンテキスト変数で参照が可能ですのでモデル間で値を渡すための器として便利というわけです。
もちろん、本来の用途のparse phase -> execute phaseへの値の受け渡しとしても使えます。
local_md5 (1.3-latestではまだ未実装)
※ こちらは、現在のmainブランチを見ると入っているものです。
次のメジャーバージョンからどうやら、local_md5というコンテキストの仲間が使えるようになるようですね。
というわけで本日は便利なコンテキストの仲間たちを紹介しました。実は隅々まで眺めるとちゃんとドキュメント化されてるものが多いのです。
この辺を使いこなしていくとすごく便利なので興味があればコードを眺めてみるのも良いと思います。
20日目はカスタムテストについてです。
Discussion