为啥在 dbt 中运行模型时出现“关系 <y> 的列 <x> 不存在”错误,但在 SQL 客户端中运行时却没有?

Posted

技术标签:

【中文标题】为啥在 dbt 中运行模型时出现“关系 <y> 的列 <x> 不存在”错误,但在 SQL 客户端中运行时却没有?【英文标题】:Why am I getting a "column <x> of relation <y> does not exist" error when running a model in dbt but not when running in a SQL client?为什么在 dbt 中运行模型时出现“关系 <y> 的列 <x> 不存在”错误,但在 SQL 客户端中运行时却没有? 【发布时间】:2021-10-25 15:21:20 【问题描述】:

问题

我们有一个增量模型,已经在我们的夜间生产作业中运行了几个月(下面的 SQL)。上周,我们的生产环境升级到v0.21.0(来自v0.19.0)后,模型开始抛出这个错误:

Database Error in model my_model (path/to/my_model.sql)
  column "alias6" of relation "my_model" does not exist
  compiled SQL at target/run/path/to/my_model.sql
-
  config(
    materialized = 'incremental',
    dist = 'alias3',
    sort = 'dates_pk',
    unique_key = '__surrogate_key',
    )
-

with calculate_metrics as (

    select        
        field1 as dates_pk,
        field2 as alias2,
         my_macro('field3')  as alias3,
        field4 as alias4,
        field5,
        field6 as alias6,
        field7 as alias7,
        field8 as alias8,
        field9 as alias9,
        (field8::float / field6)::decimal(18, 6) as alias10,
        (field9::float / field7)::decimal(18, 6) as alias11,
         dbt_utils.surrogate_key([
            'field1', 'field2', 'alias4', 'field5'])  as __surrogate_key
    from  ref('upstream_model') 
    % if is_incremental() -%
    where dates_pk >= coalesce((select max(dates_pk) from  this ), '2000-01-01')
    %- endif -%

)

select * from calculate_metrics

到目前为止我已经尝试过什么

prod env, v0.21.0。由于该错误看起来类似于增量模型的架构更改时发生的情况(它没有),所以我做了dbt run -s my_model+ --full-refresh。遇到同样的错误。 dev env, v0.21.0。删除了我的dev 模式,运行dbt clean &amp;&amp; dbt deps,然后交替运行dbt rundbt build。在同一型号上失败。 dev env, v0.21.0。试过dbt build -s my_model --full-refresh;不走运。 我从 SQL 客户端运行 Redshift 中 target/ 目录中的已编译 SQL。 没有出错。 dev env, v0.19.0。降级了我的dev env 并从头开始运行模型血统。在同一型号上失败。这把我扔了;我真的怀疑升级了。 dev env, v0.19.0。将模型实现更改为 table,并在 dev 中从头开始运行模型沿袭。遇到同样的错误。 dev env, v0.19.0。削减代码的方式,看看我是否可以做任何事情让它运行。这至少引发了一个稍微不同的错误。
-
  config(
    materialized = 'table',
    )
-

with calculate_metrics as (

    select        
        field1,
        field2,
         my_macro('field3')  as alias3,
        field4,
        field5,
        field6,
        field7,
        field8,
        field9
    from  ref('upstream_model') 

)

select * from calculate_metrics

Database Error in model my_model (path/to/my_model.sql)
  column "dates_pk" of relation "my_model" does not exist
  compiled SQL at target/run/path/to/my_model.sql

所以dbt 似乎正在运行一些数据库操作,该操作正在寻找模型中以前但现在不存在的别名。不知道为什么会这样,table 实现。

【问题讨论】:

【参考方案1】:

感谢 dbt 支持团队的一番调查,我们找到了这个问题的原因。

模型的 YML 文档文件包含模型中未找到的列名(请参阅下面的示例 YML),并且最近已为模型启用了 dbt's persist_docs feature。

models:
  - name: my_model
    columns:
      ...
      # This should have been named alias6, but was not updated 
      # when the model changed at some point in the past; this
      # didn't cause an error until persist_docs attempted to
      # `comment` on the (non-existent) field in Redshift
      - name: field6
        description: Foo bar baz.

更具体的错误消息将有助于更快地查明真相,因此我在 dbt-core Github 上记录了 this issue。

【讨论】:

以上是关于为啥在 dbt 中运行模型时出现“关系 <y> 的列 <x> 不存在”错误,但在 SQL 客户端中运行时却没有?的主要内容,如果未能解决你的问题,请参考以下文章

运行 dbt 时出现“目标未定义”错误

为啥在 Eloquent 模型中调用方法时出现“不应静态调用非静态方法”?

为啥我尝试在真实设备中运行代码时出现以下错误?

为啥在 cmd 中运行 ant sonar 命令时出现错误?

DBT模型挂

为啥运行 yarn start 时出现语法错误