#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:
Вы имеете в виду, что:
- Вы не хотите, чтобы имя схемы с добавленным к нему префиксом , например, просто было
finance.modelname
вместоdbname_finance.modelname
, или - вы хотите, чтобы имя отношения отображалось с именем из двух частей (
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. Можете ли вы предложить мне какое-то решение/обходной путь для сценария, который я упомянул в приведенном выше комментарии. Спасибо