🎉

dbt macro tips advent calendar 2022 day 19 - コンテキストの中の便利なもの

2022/12/19に公開

便利なデータ変換ツールである dbt の中のmacroに関するtipsを書いていく dbt macro tips Advent Calendar 2022 19日目です。

先日は hookの中身を深くほっていきました。
すると、ドキュメントにはないrender()なるものを見つけました。
コンテキストにはまだまだ知らぬものが隠されているようなので見ていきたいと思います。
ということで、ドキュメントにあるなし関わらずコンテキストの便利なものを紹介していこうと思います。
なお、ドキュメントには無いものは、将来的に変わる可能性もあるので使う場合は要注意です。

コンテキスト

modules

https://github.com/dbt-labs/dbt-core/blob/0544b085439b3a635b8ce56adbf56d8e7c7e6839/core/dbt/context/base.py#L602-L625

https://docs.getdbt.com/reference/dbt-jinja-functions/modules

こちらは、こちらはpythonでよく使う 時関係やiterator系のmodeulesをJinjaテンプレート上で使えるようにしたものです。 こちらはどこでも使えるようになっています。

dbt_version

https://github.com/dbt-labs/dbt-core/blob/1.3.latest/core/dbt/context/base.py#L204-L221

https://docs.getdbt.com/reference/dbt-jinja-functions/dbt_version

set, zip

https://docs.getdbt.com/reference/dbt-jinja-functions/set

https://docs.getdbt.com/reference/dbt-jinja-functions/zip

この辺は、tupleやlistの操作ですね。 2つのリストをマージしたり。unique化したり等でゴリゴリの操作をしたいときにお世話になります。

diff_of_two_dicts

https://github.com/dbt-labs/dbt-core/blob/1.3.latest/core/dbt/context/base.py#L663C9-L688

こちらはドキュメントにはありません。
set,zipとにてますが、これは2つのdictの差をとってくれます。
局所的に便利なので、知っておくと良いかもしれません。

fromjson, tojson, fromyaml, toyaml

https://docs.getdbt.com/reference/dbt-jinja-functions/fromjson
https://docs.getdbt.com/reference/dbt-jinja-functions/tojson
https://docs.getdbt.com/reference/dbt-jinja-functions/fromyaml
https://docs.getdbt.com/reference/dbt-jinja-functions/toyaml

Jinjaテンプレート上で扱ってるものや、DBからクエリしてきたものをフォーマット指定して出力したいときにお世話になります。

dbt_invocation_id, run_started_at

https://docs.getdbt.com/reference/dbt-jinja-functions/dbt_invocation_id
https://docs.getdbt.com/reference/dbt-jinja-functions/run_started_at

dbt_invocation_idは実行ごとにUUIDを生成してくれます。
run_started_atはdbtの実行が開始された時刻ですね。

この辺は監査系のログを作るときにお世話になります。

flags,invocation_args_dict

https://docs.getdbt.com/reference/dbt-jinja-functions/flags

これらは、dbtの実行コマンドが得られます。
特に invocation_args_dict はselector_nameまで取れるのがいいですね。

特定のselectorで実行しているときだけ特殊な処理をはさみたいみたいなmacroを作るのに便利です。
いわゆるconditional global hookってやつですかね。

config

https://docs.getdbt.com/reference/dbt-jinja-functions/config

皆様おなじみのconfigなのですが、実は実装を深堀りしていくとexecute phaseとparse phaseでは異なるConfigが渡っているということが見えてきます。

https://github.com/dbt-labs/dbt-core/blob/1.3.latest/core/dbt/context/providers.py#L312-L424

実は、 parse phaseではconfigにsetができてしまうのですね。
コレは中々に、便利です。parse phaseならば呼び出されたmacroの中から、modelのconfigに任意の値を入れることができる。
更に、その値はexecute phaseならば、graphコンテキスト変数で参照が可能ですのでモデル間で値を渡すための器として便利というわけです。
もちろん、本来の用途のparse phase -> execute phaseへの値の受け渡しとしても使えます。

local_md5 (1.3-latestではまだ未実装)

※ こちらは、現在のmainブランチを見ると入っているものです。
https://github.com/dbt-labs/dbt-core/blob/main/core/dbt/context/base.py#L694-L703

次のメジャーバージョンからどうやら、local_md5というコンテキストの仲間が使えるようになるようですね。


というわけで本日は便利なコンテキストの仲間たちを紹介しました。実は隅々まで眺めるとちゃんとドキュメント化されてるものが多いのです。
この辺を使いこなしていくとすごく便利なので興味があればコードを眺めてみるのも良いと思います。

20日目はカスタムテストについてです。

Discussion