О блоках 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'],
...
]