自定义aliase
概述¶
当dbt运行一个模型时,它通常会在数据库中创建一个关系(表或视图)。默认情况下,dbt使用模型的文件名作为数据库中此关系的标识符。也可以使用alias别名模型配置选择性地覆盖此标识符。
为什么要别名模型名称?¶
schema和表的名称实际上是“数据仓库”的“用户界面”。命名良好的模式和表可以帮助为这些数据的消费者提供清晰性和方向性。与自定义schema相结合,模型别名是设计数据仓库的一种强大机制。
使用方法¶
alias别名配置可用于更改数据库中模型标识符的名称。以下表显示了带有和不带有提供的别名模型的数据库标识符示例。
| 模型 | 配置 | 数据库标识符 |
|---|---|---|
| ga_sessions.sql | <None> | "analytics"."ga_sessions" |
| ga_sessions.sql | {{ config(alias='sessions') }} | "analytics"."sessions" |
要配置模型的别名,请为模型的alias别名配置参数提供一个值。例如:
-- This model will be created in the database with the identifier `sessions`
-- Note that in this example, `alias` is used along with a custom schema
{{ config(alias='sessions', schema='google_analytics') }}
select * from ...
当从不同的模型引用上面的ga_sessions模型时,请像往常一样将 ref() 函数与模型的 filename 一起使用。例如:
-- Use the model's filename in ref's, regardless of any aliasing configs
select * from {{ ref('ga_sessions') }}
union all
select * from {{ ref('snowplow_sessions') }}
generate_alias_name¶
为模型生成的别名由名为generate_alias_name的宏控制。可以在dbt项目中重写此宏,以更改dbt别名模型的方式。此宏的工作原理与generate_schema_name宏类似。
要覆盖dbt的别名生成,请在自己的dbt项目中创建一个名为generate_alias_name的宏。generate_alias_name宏接受两个参数:
- 模型配置中提供的自定义别名
- 正在为其生成自定义别名的节点
generate_alias_name的默认实现只使用提供的alias配置(如果存在)作为模型别名,否则返回到模型名称。此实现方式如下所示:
{% macro generate_alias_name(custom_alias_name=none, node=none) -%}
{%- if custom_alias_name is none -%}
{{ node.name }}
{%- else -%}
{{ custom_alias_name | trim }}
{%- endif -%}
{%- endmacro %}
告诫¶
数据库标识符不明确¶
使用别名,可能会意外地创建标识符不明确的模型。给定以下两个模型,dbt将尝试在数据库中创建两个具有相同名称的视图(即“sessions”):
无论这些模型中哪一个运行第二都将“获胜”,而且通常情况下,dbt的输出不会是您所期望的。为了避免这种失败模式,dbt将检查您的模型名称和别名在本质上是否不明确。如果是,您将收到一条错误消息,如下所示:
$ dbt compile
Encountered an error:
Compilation Error
dbt found two resources with the database representation "analytics.sessions".
dbt cannot create two resources with identical database representations. To fix this,
change the "schema" or "alias" configuration of one of these resources:
- model.my_project.snowplow_sessions (models/snowplow_sessions.sql)
- model.my_project.sessions (models/sessions.sql)
如果这些模型确实应该具有相同的数据库标识符,则可以通过为其中一个模型配置自定义schema来解决此错误。