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

where

Определение

Фильтрует ресурс, который тестируется (модель, источник, сид или снимок).

Условие where вставляется в тестовый запрос, заменяя ссылку на ресурс на . Например, тест not_null может выглядеть так:

select *
from my_model
where my_column is null

Если конфигурация where установлена на where date_column = current_date, то тестовый запрос будет обновлен до:

select *
from (select * from my_model where date_column = current_date) dbt_subquery
where my_column is null

Примеры

Настройте конкретный экземпляр общего (схемного) теста:

models/<filename>.yml
version: 2

models:
- name: large_table
columns:
- name: my_column
tests:
- accepted_values:
values: ["a", "b", "c"]
config:
where: "date_column = current_date"
- name: other_column
tests:
- not_null:
where: "date_column < current_date"

Пользовательская логика

Контекст рендеринга для конфигурации where такой же, как и для всех конфигураций, определенных в файлах .yml. У вас есть доступ к {{ var() }} и {{ env_var() }}, но у вас нет доступа к пользовательским макросам для установки этой конфигурации. Если вы хотите использовать пользовательские макросы для шаблонизации фильтра where для определенных тестов, существует обходной путь.

Начиная с версии v0.21, dbt определяет get_where_subquery макрос.

dbt заменяет {{ model }} в определениях общих тестов на {{ get_where_subquery(relation) }}, где relation — это ref() или source() для тестируемого ресурса. Стандартная реализация этого макроса возвращает:

  • {{ relation }}, когда конфигурация where не определена (ref() или source())
  • (select * from {{ relation }} where {{ where }}) dbt_subquery, когда конфигурация where определена

Вы можете переопределить это поведение, выполнив следующие действия:

  • Определив пользовательский get_where_subquery в вашем корневом проекте
  • Определив пользовательский <adapter>__get_where_subquery кандидат на диспетчеризацию в вашем пакете или адаптере

Внутри этого определения макроса вы можете ссылаться на любые пользовательские макросы, основываясь на статических входных данных из конфигурации. В самом простом виде это позволяет вам избежать дублирования кода, который вам в противном случае пришлось бы повторять в различных файлах .yml. Поскольку макрос get_where_subquery разрешается во время выполнения, ваши пользовательские макросы также могут включать получение результатов интроспективных запросов к базе данных.

Пример: Отфильтруйте ваш тест по данным за последние три дня, используя кроссплатформенный макрос dateadd() от dbt.

models/config.yml
version: 2
models:
- name: my_model
columns:
- name: id
tests:
- unique:
config:
where: "date_column > __three_days_ago__" # строка-заполнитель для статической конфигурации
macros/custom_get_where_subquery.sql
{% macro get_where_subquery(relation) -%}
{% set where = config.get('where') %}
{% if where %}
{% if "__three_days_ago__" in where %}
{# замените строку-заполнитель на результат пользовательского макроса #}
{% set three_days_ago = dbt.dateadd('day', -3, current_timestamp()) %}
{% set where = where | replace("__three_days_ago__", three_days_ago) %}
{% endif %}
{%- set filtered -%}
(select * from {{ relation }} where {{ where }}) dbt_subquery
{%- endset -%}
{% do return(filtered) %}
{%- else -%}
{% do return(relation) %}
{%- endif -%}
{%- endmacro %}
0