😽

dbt macro tips advent calendar 2022 day 5 - 変数

2022/12/05に公開

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

変数

macroは引数は取ることができました。実はこの引数、変数と呼ばれるものの一種です。
変数は何かしらの値をいれて、保持しそれを再利用するためのものです。
他の汎用プログラミング言語を使用している人にとっては、「なにを当たり前な!?」と思うでしょうが、Jinjaではテンプレート中で変数を宣言することができます。

ではまず、基本形です。

macro/noop.sql
{%- macro noop() %}
{%- set num = 25 %}
-- num = {{ num }}
{%- endmacro %}

コレを描画すると

-- num = 25

となる。他の汎用プログラミング言語を使用したことのある方は少し違和感があるかもしれませんが、以下のように再定義することができます。

macro/noop.sql
{%- macro noop() %}
{%- set num = 25 %}
{%- set num = num + 2 %}
-- num = {{ num }}
{%- endmacro %}

こちらを描画すると

-- num = 27

となります。

変数には型というものがあります。わかる人向けにはJinjaテンプレートでは動的型付けとなります。
型というのは、変数に何が入るのか? 属性の情報になります。

Jinjaテンプレートでは、変数に何が入っているのかを調べるテスト関数というものがあります。
例えば、以下のように変数に入っているものが 文字列(string) であるのかを調べる関数があります。

macro/noop.sql
{%- macro noop() %}
{%- set num = 25 %}
{%- set str = "hoge" %}
{%- if num is string %}
-- num is string 
{%- else %}
-- num is not string
{%- endif %}
{%- if str is string %}
-- str is string 
{%- else %}
-- str is not string
{%- endif %}
{%- endmacro %}

こちらを描画すると

-- num is not string
-- str is string

となります。

冒頭でmacroの引数は変数の一種と表現しました。引数にも当然、型があります。
想定された型の値が与えられているか?というチェックは、上記のようにして調べることが可能です。

こちらに、Jinjaテンプレートで使用可能なBuiltinなテスト関数群があるので、実際に使うときはこの辺を参照してみると良いでしょう。

setのもう一つの使い方

SQLのような長い文字列を使用したり、その文字列の中で別の変数を参照したいということがあるでしょう。
そのような場合に便利な記法として以下があります。

macro/noop.sql
{%- macro noop() %}
{%- set num = 25 %}
{%- set sql %}
SELECT {{ num }} as num
{%- endset %}
{{ sql }}
{%- endmacro %}

こちらを描画すると、

SELECT 25 as num

このようになります。 SQLなどの長い文字列を変数に入れる場合はこちらが便利でしょう。

リストの追記

変数の型の一つにリストというのがあります。

macro/noop.sql
{%- macro noop() %}
{%- set numbers = [25, 35, 22, 11] %}
-- numbers is {{ numbers }}
{%- endmacro %}
-- numbers is [25, 35, 22, 11]

この型は、参照しているモデルの列挙や、処理対象の列の定義などで大変便利なのでよく使います。

場合によっては、このリストに追記したいケースがあるでしょう。そういう場合は以下のようにします。

macro/noop.sql
{%- macro noop() %}
{%- set numbers = [25, 35, 22, 11] %}
-- numbers is {{ numbers }}
{%- do numbers.append(33) %}
-- numbers is {{ numbers }}
{%- do numbers.extend([55, 66]) %}
-- numbers is {{ numbers }}
{%- endmacro %}
-- numbers is [25, 35, 22, 11]
-- numbers is [25, 35, 22, 11, 33]
-- numbers is [25, 35, 22, 11, 33, 55, 66]

このように、 do というものを使うことで、リストの追記が可能になります。
あとあと、このdo というものはよく使うので、明日の部で説明することとしましょう。


5日目は変数に関する説明で、macroというよりはJinjaテンプレートの仕様についての話になってしましました。
6日目は doとlogの話になると思います。 7日目以降は、より実用的なtipsに入っていきたいと思います。

Discussion