Перейти к основному содержимому

О блоках statement

Рекомендация

Мы рекомендуем использовать макрос run_query вместо блоков statement. Макрос run_query предоставляет более удобный способ выполнения запросов и получения их результатов, оборачивая блоки statement. Вы можете использовать этот макрос для написания более лаконичного кода, который легче поддерживать.

statement — это SQL-запросы, которые обращаются к базе данных и возвращают результаты в ваш Jinja-контекст. Вот пример statement, который получает все штаты из таблицы пользователей .

get_states_statement.sql
-- 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.

 Пример использования -- depends_on
 Пример использования функции ref()

Аргументы:

  • name (строка): Имя для набора результатов, возвращаемого этим statement
  • fetch_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 это может выглядеть так:

load_states.sql
{%- set states = load_result('states') -%}
{%- set states_data = states['data'] -%}
{%- set states_status = states['response'] -%}

Содержимое возвращаемого поля data — это матрица. Она содержит список строк, каждая из которых является списком значений, возвращаемых базой данных. Для приведенного выше примера эта структура данных может выглядеть так:

states.sql
>>> log(states_data)

[
['PA'],
['NY'],
['CA'],
...
]
0