为啥在 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 && dbt deps
,然后交替运行dbt run
和dbt 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 客户端中运行时却没有?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Eloquent 模型中调用方法时出现“不应静态调用非静态方法”?