DBT(数据构建工具)- 删除在部署时添加到每个模型的默认数据库前缀
DBT(Data Build Tools) - drop the default database prefix that gets added to each model on deployment
在 DBT 中,每当我们部署模型时,数据库名称都会在数据库中的 sql 定义中为每个部署的模型添加前缀。
我需要以不将数据库名称作为已部署模型前缀的方式配置 dbt 项目。
你的意思是:
- 您不希望模式名称添加前缀,例如
finance.modelname
而不是 dbname_finance.modelname
,或者
- 您希望使用两部分名称 (
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
中找到更多详细信息
在 DBT 中,每当我们部署模型时,数据库名称都会在数据库中的 sql 定义中为每个部署的模型添加前缀。
我需要以不将数据库名称作为已部署模型前缀的方式配置 dbt 项目。
你的意思是:
- 您不希望模式名称添加前缀,例如
finance.modelname
而不是dbname_finance.modelname
,或者 - 您希望使用两部分名称 (
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
中找到更多详细信息