DBT(数据构建工具)- 删除在部署时添加到每个模型的默认数据库前缀

DBT(Data Build Tools) - drop the default database prefix that gets added to each model on deployment

在 DBT 中,每当我们部署模型时,数据库名称都会在数据库中的 sql 定义中为每个部署的模型添加前缀。

我需要以不将数据库名称作为已部署模型前缀的方式配置 dbt 项目。

你的意思是:

  1. 您不希望模式名称添加前缀,例如 finance.modelname 而不是 dbname_finance.modelname,或者
  2. 您希望使用两部分名称 (schema.modelname) 而不是三部分名称 (database.schema.modelname) 呈现关系名称吗?

如果#1,我建议您阅读整个 custom schema names docs page, specifically the part about Advanced custom schema configuration

如果是#2,则这是适配器级别所需的更改。由于您已标记 synapse,我猜您正在使用 Synapse SQL 无服务器池,因为我也遇到过这样一个事实,即您不能在无服务器池中使用由三部分组成的名称.上周,我实际上 dbt-synapse-serverless 从 dbt-synapse 中创建了一个单独的适配器,它实际上禁用了三部分名称。

您可以覆盖内置的 ref 宏。这个宏 return 是一个 Relation 对象,所以我们可以像这样操作它的输出:

{% macro ref(model_name) %}

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

{% endmacro %}

因此,从那里开始,所有使用 ref 函数的模型都将 return 没有 database 规范的 Relation 对象。

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

可以在 official documentation

中找到更多详细信息