DBT 'dbt snapshot' 命令导致错误:“快照快照名称中的数据库错误无法识别的名称:id 在 [53:13]”

问题描述

正如问题所说,我正在运行 dbt snapshot 命令,但我的一些快照无法正常工作,因为 DBT 无法识别我创建的代理键 id。我的快照都是以相同的方式构建的,它们所基于的基本视图也是如此。下面是一个无法识别代理键而无法工作的快照示例:

{% snapshot example_snapshot %}
    {{ config(
        target_schema = 'snapshots',unique_key = 'id',strategy = 'check',check_cols = 'all'
    ) }}

    SELECT
        *
    FROM
        {{ ref('base_example') }}
{% endsnapshot %}

接下来是它引用的基本视图示例:

WITH src AS (
    SELECT
        *
    FROM
        {{ source(
            'tomato','potato'
        ) }}
),cleaned AS (
    SELECT
        *,{{ dbt_utils.surrogate_key(['column','another_column','yet_another_column']) }} AS id
    FROM
        src
)
SELECT 
    *
FROM 
    cleaned

请记住,当我运行命令 dbt run -m [base_example] 时,它会生成一个视图,我可以在其中看到作为代理键生成的哈希值。只有当我运行 dbt snapshot 时才会出现问题。事实上,运行 dbt snapshot --select [example_snapshot] 一次只运行一个快照不会给我任何快照的任何错误。最令人困惑的部分:我有一个基本视图和该基本视图的快照完全配置为其他三个不起作用,但它在创建快照时识别代理键。我真的很难过,任何帮助将不胜感激。

解决方法

根据我的经验,当依赖于 dbt 模型(通过 ref('base_example'))而不是来源时,快照会变得有点不稳定。这是可取的,尽管文档中没有很好地解释为什么to select from the source

由于您的转换只是基于源中的三列添加一个代理键,我想知道您是否可以将转换粘贴在 unique_key 参数中,á la(这里考虑的是 Redshift 领域而不进行测试):

{% snapshot example_snapshot %}
    {{ config(
        target_schema = 'snapshots',unique_key = 'md5(column,another_column,yet_another_column)',strategy = 'check',check_cols = 'all'
    ) }}

    SELECT
        *
    FROM
        {{ source('tomato','potato') }}
{% endsnapshot %}