首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于自定义架构名称的宏不适用于dbt包

用于自定义架构名称的宏不适用于dbt包
EN

Stack Overflow用户
提问于 2021-01-06 07:54:32
回答 2查看 869关注 0票数 2

我在dbt包中使用自定义模式名称时遇到问题。

我使用dbt documentation中提供的宏。

代码语言:javascript
复制
{% macro generate_schema_name(custom_schema_name, node) -%}

    {%- set default_schema = target.schema -%}
    {%- if custom_schema_name is none -%}

        {{ default_schema }}

    {%- else -%}

        {{ default_schema }}_{{ custom_schema_name | trim }}

    {%- endif -%}

{%- endmacro %}

我把这个宏放在我的dbt包中,这里是dbt package

最后,我在另一个dbt项目dbt project中使用了这个dbt包。

下面是我的dbt项目中的dbt_project.yml:

代码语言:javascript
复制
name: 'covid_france'
version: '0.0.1'
config-version: 2

profile: 'default'

source-paths: ["models"]
analysis-paths: ["analysis"]
test-paths: ["tests"]
data-paths: ["data"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]

target-path: "target"  
clean-targets:         
    - "target"
    - "dbt_modules"

我的dbt包中的dbt_project.yml:

代码语言:javascript
复制
name: 'covid_france'
version: '0.0.1'
config-version: 2

profile: 'default'

source-paths: ["models"]
analysis-paths: ["analysis"]
test-paths: ["tests"]
data-paths: ["data"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]

target-path: "target"  
clean-targets:         
    - "target"
    - "dbt_modules"

models:
    covid_france:
        stg:
            materialized: table
            schema: stg
        ods:
            materialized: table
            process-airbyte-outputs:
                schema: ods
            unions:
                schema: ods
        prs:
            materialized: view

当我尝试运行我的dbt项目时,它导入了dbt包,但没有应用应该从自定义模式名称中删除主模式前缀(在profiles.yml中提供)的宏,例如:我的profiles.yml中提供的模式是"prs“。我还有其他自定义模式,名为ods和stg。但当dbt运行时,它会产生prs、prs_ods和prs_stg。

当我在dbt项目中直接使用宏时,它工作得很好(而不是将它放在dbt项目中使用的dbt包中)。

提前谢谢你!

EN

回答 2

Stack Overflow用户

发布于 2021-07-12 12:07:54

在文档中:https://docs.getdbt.com/docs/building-a-dbt-project/building-models/using-custom-schemas#changing-the-way-dbt-generates-a-schema-name

上面写着:

注意: dbt会忽略任何自定义generate_schema_name宏,这些宏是安装在项目中的包的一部分。

因此,绕过这个问题的方法是直接在项目中创建一个小的“填补”或薄包装器,它调用包中的宏。

我认为包项目名称与实际项目名称(两个dbt_project.yml文件的第1行)相同有点令人困惑,所以为了清楚起见,我会给它们起不同的名称。

例如,假设您将包重命名为package_project_name,请使用包中已有的宏代码,但在项目中添加另一个宏,如

代码语言:javascript
复制
{% macro generate_schema_name(custom_schema_name, node) -%}

  {{- package_project_name.generate_schema_name(custom_schema_name, node) }}

{%- endmacro %}
票数 1
EN

Stack Overflow用户

发布于 2021-02-07 22:54:57

我认为您还需要定义作业的目标,因为宏依赖于目标架构。例如

代码语言:javascript
复制
dbt run --models my_model --target dev

在dbt云作业中,您可以定义为

代码语言:javascript
复制
      "settings": {"threads": 1,"target_name": "prod"},
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65588257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档