【问题标题】:DBT custom schema using folder structure使用文件夹结构的 DBT 自定义架构
【发布时间】:2021-12-08 08:21:15
【问题描述】:

DBT 中有没有一种方法可以通过查看文件夹结构以派生方式为模型创建自定义架构?

例如,假设这是我的结构:

models
└-- product1
    └-- team1
    |   └-- model1.sql
    └-- team2
        └-- model2.sql

在这种情况下,model1.sql 将在架构 product1_team1 中创建,而 model2.sql 将在架构 product1_team2 中创建。我想我可以在dbt_project.yml 文件中“手动”指定这些,但我想知道是否有办法以自动方式执行此操作 - 以便在正确的模式中自动创建每个新模型或文件夹。

我正在查看自定义模式宏 (https://docs.getdbt.com/docs/building-a-dbt-project/building-models/using-custom-schemas),但它似乎是普通的 jinja 或简单的 Python 内置插件。不确定如何访问这些宏中的文件夹路径。

另外,有没有办法在 Python 中编写宏?因为知道文件路径和 os 模块可能相对简单。

【问题讨论】:

  • 虽然有一些可用于 dbt jinja 的模块(链接:modules)但不幸的是,os 不是其中之一......像vars 这样的东西是否适合您的用例?

标签: dbt


【解决方案1】:

您可以仅使用 Jinja 函数和 dbt 上下文变量来实现。

正如您所注意到的,我们可以覆盖处理模式名称的 dbt 内置宏,幸运的是,有一种方法可以使用在宏的参数中定义的 node 变量来访问模型的路径。

我在这个例子中使用了fqn 属性:

{% macro generate_schema_name(custom_schema_name, node) -%}

    {%- set default_schema = target.schema -%}

    {%- if custom_schema_name is none -%}

        {# Check if the model does not contain a subfolder (e.g, models created at the MODELS root folder) #}
        {% if node.fqn[1:-1]|length == 0 %}
            {{ default_schema }}    
        {% else %}
            {# Concat the subfolder(s) name #}
            {% set prefix = node.fqn[1:-1]|join('_') %}
            {{ prefix | trim }}
        {% endif %}

    {%- else -%}

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

    {%- endif -%}

{%- endmacro %}

fqn 属性将根据模型的位置返回一个列表,其中第一个位置是 dbt 项目名称,最后一个位置是模型名称。因此,根据您的示例,我们将拥有以下内容:

[<project_name>, 'product1', 'team1', 'model1']

如果您执行dbt ls --m &lt;model_name&gt;,您会注意到输出正是fqn 返回的内容

node.fqn[1:-1] 是对列表进行切片的最短且最符合 Python 的方法。因此,该命令基本上是删除列表的第一个和最后一个位置(项目名称和模型名称),只留下模型的剩余路径。

考虑到这一点,我们有一个条件来检查模型是否不包含子文件夹,因为如果是这种情况,我们将只返回profiles.yml 中定义的default_schema。否则,我们继续使用join Jinja 函数将列表转换为字符串的逻辑。

如果您愿意,最好记录 node 变量以查看我们拥有的所有可用选项。

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2013-01-31
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多