О макросе run_query
Макрос run_query
предоставляет удобный способ выполнения запросов и получения их результатов. Это обертка вокруг блока statement, который более гибкий, но также более сложный в использовании.
Аргументы:
query
: SQL-запрос для выполнения
Возвращает объект Table с результатом запроса. Если указанный запрос не возвращает результаты (например, , или запрос на обслуживание), то возвращаемое значение будет none
.
Примечание: Макрос run_query
не начнет транзакцию автоматически - если вы хотите выполнить ваш запрос внутри транзакции, пожалуйста, используйте операторы begin
и commit
по мере необходимости.
Посмотрите раздел руководства по началу работы о использовании Jinja для примера работы с результатами макроса run_query
!
Пример использования:
{% set results = run_query('select 1 as id') %}
{% do results.print_table() %}
-- выполните что-то с `results` здесь...
{% macro run_vacuum(table) %}
{% set query %}
vacuum table {{ table }}
{% endset %}
{% do run_query(query) %}
{% endmacro %}
Вот пример использования этого (хотя если вы используете run_query
для возврата значений столбца, ознакомьтесь с макросом get_column_values в пакете dbt-utils).
{% 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-запросами.
{% 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 %}