为什么在 dbt 中运行模型时收到"column <x> of relation <y> does not exist"错误,而在 SQL 客户端中运行时却没有?



问题

我们有一个增量模型,它已经在我们的夜间生产作业中运行了几个月(下面的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 && dbt deps,并交替执行dbt rundbt build。在同一型号上失败
  • CCD_ 10。尝试dbt build -s my_model --full-refresh;没有运气
  • 我从一个SQL客户端从Redshift中的target/目录运行编译后的SQL。是否得到错误
  • dev env, v0.19.0。降低了我的devenv的级别,并从头开始运行模型谱系。在同一型号上失败。这让我大吃一惊;我真的怀疑升级了
  • dev env, v0.19.0。将模型物化更改为table,并在dev中从头开始运行模型沿袭。得到了相同的错误
  • CCD_ 18。把代码放回原处,看看我是否可以做些什么让它运行。这至少引发了一个略有不同的错误
{{-
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的具体化。

由于dbt支持团队的一些调查,我们发现了这个问题的原因。

该模型的YML文档文件包含一个在该模型中找不到的列名(请参阅下面的示例YML),并且dbt的persist_docs功能最近已为该模型启用。

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核心Github上记录了这个问题。