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

О макросе run_query

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

Аргументы:

  • query: SQL-запрос для выполнения

Возвращает объект Table с результатом запроса. Если указанный запрос не возвращает результаты (например, , или запрос на обслуживание), то возвращаемое значение будет none.

Примечание: Макрос run_query не начнет транзакцию автоматически - если вы хотите выполнить ваш запрос внутри транзакции, пожалуйста, используйте операторы begin и commit по мере необходимости.

Впервые используете run_query?

Посмотрите раздел руководства по началу работы о использовании Jinja для примера работы с результатами макроса run_query!

Пример использования:

models/my_model.sql
{% set results = run_query('select 1 as id') %}
{% do results.print_table() %}

-- выполните что-то с `results` здесь...
macros/run_grants.sql
{% macro run_vacuum(table) %}

{% set query %}
vacuum table {{ table }}
{% endset %}

{% do run_query(query) %}
{% endmacro %}

Вот пример использования этого (хотя если вы используете run_query для возврата значений столбца, ознакомьтесь с макросом get_column_values в пакете dbt-utils).

models/my_model.sql

{% set payment_methods_query %}
select distinct payment_method from app_data.payments
order by 1
{% endset %}

{% set results = run_query(payment_methods_query) %}

{% if execute %}
{# Возвращаем первый столбец #}
{% set results_list = results.columns[0].values() %}
{% else %}
{% set results_list = [] %}
{% endif %}

select
order_id,
{% for payment_method in results_list %}
sum(case when payment_method = '{{ payment_method }}' then amount end) as {{ payment_method }}_amount,
{% endfor %}
sum(amount) as total_amount
from {{ ref('raw_payments') }}
group by 1

Вы также можете использовать run_query для выполнения SQL-запросов, которые не являются select-запросами.

macros/run_vacuum.sql
{% macro run_vacuum(table) %}

{% set query %}
vacuum table {{ table }}
{% endset %}

{% do run_query(query) %}
{% endmacro %}

Используйте фильтр length, чтобы проверить, вернул ли run_query какие-либо строки. Убедитесь, что логика обернута в блок if execute, чтобы избежать неожиданного поведения во время парсинга.

{% if execute %}
{% set results = run_query(payment_methods_query) %}
{% if results|length > 0 %}
-- выполните что-то с `results` здесь...
{% else %}
-- выполните резервное действие здесь...
{% endif %}
{% endif %}
0