О блоках statement
Мы рекомендуем использовать макрос run_query вместо блоков statement. Макрос run_query предоставляет более удобный способ выполнения запросов и получения их результатов, оборачивая блоки statement. Вы можете использовать этот макрос для написания более лаконичного кода, который легче поддерживать.
statement — это SQL-запросы, которые обращаются к базе данных и возвращают результаты в ваш Jinja-контекст. Вот пример statement, который получает все штаты из таблицы пользователей .
-- depends_on: {{ ref('users') }}
{%- call statement('states', fetch_result=True) -%}
select distinct state from {{ ref('users') }}
{%- endcall -%}
Сигнатура блока statement выглядит следующим образом:
statement(name=None, fetch_result=False, auto_begin=True)
При выполнении statement dbt должен понимать, как разрешать ссылки на другие модели или ресурсы dbt. Если вы уже используете ref для модели вне блока statement, зависимость будет автоматически определена, но в противном случае вам нужно будет принудительно указать зависимость с помощью -- depends_on.
Аргументы:
name(строка): Имя для набора результатов, возвращаемого этим statementfetch_result(bool): Если True, загрузить результаты statement в Jinja-контекстauto_begin(bool): Если True, открыть транзакцию, если она не существует. Если False, не открывать транзакцию.
После выполнения бло ка statement набор результатов доступен через функцию load_result. Объект результата включает три ключа:
response: Структурированный объект, содержащий метаданные, возвращаемые из базы данных, которые зависят от адаптера. Например, код успехаcode, количество затронутых строкrows_affected, общий объем обработанных байтbytes_processedи т.д. Сравнимо сadapter_responseв объекте результата.data: Питоническое представление данных, возвращаемых запросом (массивы, кортежи, словари).table: Представление данных в виде таблицы Agate, возвращаемых запросом.
Для приведенного выше statement это может выглядеть так:
{%- set states = load_result('states') -%}
{%- set states_data = states['data'] -%}
{%- set states_status = states['response'] -%}
Содержимое возвращаемого поля data — это матрица. Она содержит список строк, каждая из которых является списком значений, возвращаемых базой данных. Для приведенного выше примера эта структура данных может выглядеть так:
>>> log(states_data)
[
['PA'],
['NY'],
['CA'],
...
]