Переопределение исходного макроса в DBT для обеспечения динамических источников для тестовых запусков

#dbt

#dbt

Вопрос:

Моя цель — иметь возможность иметь «динамические» источники в зависимости от типа запуска DBT, который я выполняю. Если быть более точным, я пытаюсь найти решение для сквозного бизнес-тестирования наших моделей DBT. Я имею в виду не схемы или простые тесты данных, а тесты бизнес-логики. Что-то вроде того, что у меня есть несколько входных таблиц с тестовыми данными, я запускаю модели DBT, а затем утверждаю, что конечные таблицы содержат желаемые результаты. Я могу создать все целевые таблицы в отдельной схеме, используя другой профиль «тест», но мне все равно нужно иметь возможность выбирать из другого набора источников, которые будут тестовыми таблицами, которые я создаю с помощью тестовых данных.

Я предполагаю, что могу использовать jinja в исходных файлах в сочетании с некоторыми переменными, чтобы это произошло, но мне интересно, есть ли еще лучший способ сделать это без изменения исходных файлов вообще. Например, разработчикам не пришлось бы беспокоиться о написании кода, который также работает для тестов. Для этой цели мне было интересно, можем ли мы переопределить исходный макрос или сделать что — то в этом роде, чтобы включить это поведение-аналогично тому, когда мы переопределяем generate_schema_name макрос. Что-то вроде (в псевдокоде python):

 def source(schema_name, table_name):  if env('is_test') == true:  return schema_name   table_name   '_test'  else:  return schema_name   table_name  

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

Любые предложения, выходящие за рамки этого метода, более чем приветствуются!

Ответ №1:

Мое мнение, что у вас должна быть отдельная база данных(базы данных) для тестирования, а также переменная для настройки имени базы данных в dbt_project.yml файле

Поэтому, когда нужно запускать тесты, вы должны иметь возможность использовать --vars опцию.

Комментарии:

1. Я думаю, что это, вообще говоря, хорошее решение, но, к сожалению, я не думаю, что оно применимо к нашему случаю, поскольку мы находимся на AWS Athena и AFAIK, у нас есть только 1 база данных (каталог данных) для региона. Мы можем играть только со схемами, но не с базами данных — отсюда и проблема с источниками.

2. @Catazza: Я еще не работал с AWS. Но если это так, то можем ли мы использовать схему в качестве переменной?

Ответ №2:

Не уверен, что это то, что вы искали, но я уже работал с динамическими источниками раньше. Мне нужно было объединить 5 таблиц, которые жили в 5 отдельных схемах, но имели одно и то же имя таблицы. Я надеюсь, что то, что я предоставлю, по крайней мере, поможет вам двигаться в правильном направлении.

У вас есть два стола:

my_database.my_schema.tableA

my_database.my_schema.tableA_test

Итак, ваш исходный файл выглядит примерно так:

 -- src.yml  sources:  - name: my_schema  database: my_database  tables:  - name: tableA  - name: tableA_test  

Вы спросили, есть ли какой-либо способ переопределить существующие макросы, такие как создание макросов. К сожалению, я лично не реализовал его таким образом для своей ситуации, потому что не хотел применять его в большем масштабе (только небольшая часть моделей).

Тогда у меня есть моя модель:

 -- my_model.sql  {%- set tbl = get_source(table_name) -%}  select   '{{tbl}}' as source,  column1,  column2,  column3 from {{ source( 'my_schema' , tbl ) }} i  

и эта модель вызывает этот макрос для настройки имени таблицы:

 -- my_macro.sql  {% macro get_source(table_name) %}  {% if target.name = 'test' %} {% set output = table_name ~ '_test' %} {% else %} {% set output = table_name %} {% endif %}  {{ return(output) }}  {% endmacro %}  

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