DBT(Инструменты построения данных) — удалите префикс базы данных по умолчанию, который добавляется к каждой модели при развертывании

#database #data-modeling #azure-synapse #dbt #fishtown-analytics

Вопрос:

В DBT всякий раз, когда мы развертываем модели, имя базы данных добавляется к каждой развернутой модели в определении sql в базе данных.

Мне нужно настроить проект dbt таким образом, чтобы он не добавлял имя базы данных к развернутым моделям.

Ответ №1:

Вы можете перезаписать встроенный ref макрос. Этот макрос возвращает Relation объект, поэтому мы можем манипулировать его выводом следующим образом:

 {% macro ref(model_name) %}

    {% do return(builtins.ref(model_name).include(database=false)) %}

{% endmacro %}
 

Таким образом, оттуда все модели, использующие ref функцию, будут возвращать Relation объект без database спецификации.

 dbt code:
select * from {{ ref('model') }}

compiled code:
select * from schema_name.model
 

Редактировать:

Как вы просили, вот пример удаления имени базы данных из источников:

 {% macro source(source_name, table_name) %}

    {% do return(builtins.source(source_name, table_name).include(database=false)) %}

{% endmacro %}
 

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

 {% macro source(source_name, table_name, include_database = False) %}

    {% do return(builtins.source(source_name, table_name).include(database = include_database)) %}

{% endmacro %}
 
 dbt code:
select * from {{ source('kaggle_aps', 'coaches') }}
select * from {{ source('kaggle_aps', 'coaches', include_database = True) }}

compiled code:
select * from schema_name.object_name
select * from database_name.schema_name.object_name
 

Более подробную информацию можно найти в официальной документации

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

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

2. да, вы можете сделать то же самое, используя builtins.source . Я отредактирую свой ответ с помощью фрагмента кода.

3. Это работает на меня. Спасибо.

Ответ №2:

Вы имеете в виду, что:

  1. Вы не хотите, чтобы имя схемы с добавленным к нему префиксом , например, просто было finance.modelname вместо dbname_finance.modelname , или
  2. вы хотите, чтобы имя отношения отображалось с именем из двух частей ( schema.modelname ) вместо имени из трех частей ( database.schema.modelname )?

Если #1, я рекомендую вам прочитать всю страницу документов по именам пользовательских схем, в частности часть о расширенной настройке пользовательских схем

Если это #2, то это изменение требуется на уровне адаптера. Поскольку вы отметили synapse , я бы поспорил, что вы используете бессерверные пулы Synapse SQL, потому что я также столкнулся с тем фактом, что вы не можете использовать имена из трех частей в бессерверных пулах. На прошлой неделе я фактически сделал dbt-synapse-бессерверный отдельный адаптер от dbt-synapse, который фактически отключает имя из трех частей.

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

1. Большое вам спасибо за ваш ответ! Это сценарий № 2, о котором я говорю в своем вопросе. Да, я использую Azure synapse , я не уверен, является ли он бессерверным или нет, придется это проверить. Буду держать вас в курсе моих выводов.

2. Это не работает, так как мы используем выделенный пул SQL. Есть ли какое-либо другое решение, которому я могу следовать, чтобы решить эту проблему для выделенного пула SQL в Azure Synapse.

3. @user961 не могли бы вы привести пример ошибки, которую вы получили? Для меня это новость, что имена из трех частей не поддерживаются в выделенном пуле. Вы пытаетесь работать с основной базой данных?

4. Я думаю, что здесь есть некоторая путаница. Таким образом, я уже получаю имена из трех частей в выделенном пуле, но я хочу, чтобы в выделенных пулах было соглашение об именах из двух частей. Не могли бы вы, пожалуйста, рассказать мне, как этого добиться, т. Е. Соглашения об именовании двух частей в выделенном пуле при развертывании с использованием DBT с помощью команды dbt run. Мы хотим, чтобы модели развертывались как schemaname.имямодели

5. Можете ли вы предложить мне какое-то решение/обходной путь для сценария, который я упомянул в приведенном выше комментарии. Спасибо