概要
本記事では、Snowflake で dbt の dbt-codegen パッケージを利用する際に、codegen の generate_source および generate_model_yaml で YAML を出力したとき、varchar や number などのデータ型について桁数(長さ、精度・スケール)を含めて取得する方法を紹介します。
generate_source コマンドで YAML を出力すると、デフォルトの挙動では varchar や number といった型名のみが出力され、桁数が出力されませんでした。
文字や数値の桁数も YAML に出力したいと考えて調査したところ、該当マクロを上書きすることで実現できました。
対応方法
変更前のマクロ
dbt-codegen の実装を確認すると、generate_source では下記の行でデータ型を出力しています。
{% do sources_yaml.append(' data_type: ' ~ codegen.data_type_format_source(column)) %}
出所: dbt-codegen/macros/generate_source.sql at 0.14.0 · dbt-labs/dbt-codegen
また、generate_model_yaml では下記の行でデータ型を出力しています。
{% do model_yaml.append(' data_type: ' ~ codegen.data_type_format_model(column)) %}
上記のとおり、いずれも codegen.data_type_format_source(column) および codegen.data_type_format_model(column) によって型表現を整形した結果を出力しています。この整形処理を Snowflake 向けに差し替えることで、桁数を含んだ型表現を出力できます。
上書きマクロ
macros 配下に任意の名称(例:codegen_overrides.sql)のファイルを作成して、下記のコードを記述します。
{% macro snowflake__data_type_format_source(column) %}
{{ return(column.data_type | lower) }}
{% endmacro %}
{% macro snowflake__data_type_format_model(column) %}
{{ return(column.data_type | lower) }}
{% endmacro %}
この上書きでは、Snowflake アダプタが返す column.data_type をそのまま(小文字化のみ)採用し、number(38,0) や character varying(25) のように、桁数を含む型表現が出力されるようにしています。
動作確認
マクロの上書き前(デフォルト)の動作
ソースの YAML を出力すると桁数が出力されません。
dbt --quiet run-operation generate_source --args '{
"database_name": "SNOWFLAKE_SAMPLE_DATA",
"schema_name": "TPCH_SF1",
"name": "tpch_sf1",
"table_names": ["CUSTOMER"],
"include_database": true,
"include_schema": true,
"generate_columns": true,
"include_data_types": true,
"include_descriptions": true
}'
version: 2
sources:
- name: tpch_sf1
description: ""
database: snowflake_sample_data
schema: tpch_sf1
tables:
- name: customer
description: ""
columns:
- name: c_custkey
data_type: number
description: ""
- name: c_name
data_type: varchar
description: ""
- name: c_address
data_type: varchar
description: ""
- name: c_nationkey
data_type: number
description: ""
- name: c_phone
data_type: varchar
description: ""
- name: c_acctbal
data_type: number
description: ""
- name: c_mktsegment
data_type: varchar
description: ""
- name: c_comment
data_type: varchar
description: ""
モデルの YAML も同様です。
dbt --quiet run-operation generate_model_yaml --args '{
"model_names": ["table_01"],
"include_data_types": true,
"upstream_descriptions": false
}'
version: 2
models:
- name: table_01
description: ""
columns:
- name: c_custkey
data_type: number
description: ""
- name: c_name
data_type: varchar
description: ""
- name: c_address
data_type: varchar
description: ""
- name: c_nationkey
data_type: number
description: ""
- name: c_phone
data_type: varchar
description: ""
- name: c_acctbal
data_type: number
description: ""
- name: c_mktsegment
data_type: varchar
description: ""
- name: c_comment
data_type: varchar
description: ""
マクロの置換後の動作
マクロを上書き後、ソースの YAML を出力するコマンドを実行すると、データ型の桁数を確認できました。
version: 2
sources:
- name: tpch_sf1
description: ""
database: snowflake_sample_data
schema: tpch_sf1
tables:
- name: customer
description: ""
columns:
- name: c_custkey
data_type: number(38,0)
description: ""
- name: c_name
data_type: character varying(25)
description: ""
- name: c_address
data_type: character varying(40)
description: ""
- name: c_nationkey
data_type: number(38,0)
description: ""
- name: c_phone
data_type: character varying(15)
description: ""
- name: c_acctbal
data_type: number(12,2)
description: ""
- name: c_mktsegment
data_type: character varying(10)
description: ""
- name: c_comment
data_type: character varying(117)
description: ""
モデルの YAML を出力するコマンドを実行すると、データ型の桁数を確認できました。
version: 2
models:
- name: table_01
description: ""
columns:
- name: c_custkey
data_type: number(38,0)
description: ""
- name: c_name
data_type: character varying(25)
description: ""
- name: c_address
data_type: character varying(40)
description: ""
- name: c_nationkey
data_type: number(38,0)
description: ""
- name: c_phone
data_type: character varying(15)
description: ""
- name: c_acctbal
data_type: number(12,2)
description: ""
- name: c_mktsegment
data_type: character varying(10)
description: ""
- name: c_comment
data_type: character varying(117)
description: ""







