编写dbt模型和存储过程有较大差异,比如不建议update和insert,大多数代码是select语句。同时需要引用jinja函数、复杂逻辑以及宏,这些差异经常让开发者不确定生成的模型是否满足需求。本文介绍dbt compile命令可以在开发过程中随时查看编译后的SQL语句,帮助开发者及时发现模型问题。
应用场景
dbt模型概念让数据团队可以轻松实现版本控制和协作,但当一些SQL语句不完全符合dbt模型框架规范时,我们可以在analysis目录中编写模型代码。任何在目录的SQL文件,dbt仅编译但不执行。这样模型代码中{``{ ref(...) }}
会编译为对应数据仓库中的表或视图等对象。
举例,假设下面模型代码:
sql
-- analyses/running_total_by_account.sql
with journal_entries as (
select *
from {{ ref('quickbooks_adjusted_journal_entries') }}
), accounts as (
select *
from {{ ref('quickbooks_accounts_transformed') }}
)
select
txn_date,
account_id,
adjusted_amount,
description,
account_name,
sum(adjusted_amount) over (partition by account_id order by id rows unbounded preceding)
from journal_entries
order by account_id, id
要编译上面文件,可以执行命令;
shell
dbt compile
然后我们可以在目录下看到编译后的文件: target/compiled/{project name}/analyses/running_total_by_account.sql
. 可以在可视化工具中粘贴并执行,注意改命令不会在目标数据库中创建物化关系:running_total_by_account
,因为这些是分析不是模型。下面详细介绍dbt compile
命令。
dbt compile 命令详解
dbt compile
命令从下面目录中源模型文件生成可执行SQL文件:model, test, analysis
,生成的SQL文件在项目内 target/
目录下。
dbt compile
应用场景:
- 检查编译输出文件,验证复杂jinja逻辑及宏
- 手动运行编译后的SQL,在调试或测试模型时,执行底层SELECT语句可以发现bug
- 编译
analysis
目录下文件,但并不执行模型文件
注意事项:
dbt compile
命令不是dbt run
或其他命令的先决条件,这些命令自己处理编译dbt compile
命令需要数据平台连接,为了收集必要的信息(查询相关的数据库元数据),用于生成目标仓库的SQL代码- 如果你仅希望dbt读并验证项目代码,但不连接到数据仓库,使用
dbt parse
命令代替 ;dbt parse
解析验证dbt项目内容,如果项目包括Jinja或yaml语法错误,命令会失败
交互式编译
从dbt1.5开始,dbt compile
命令可以在命令行交互式执行,可以展示节点或任意dbt-sql查询编译后的代码:
- -- select 指定节点名称
- -- inline 指定任意dbt-sql查询
上面命令会在命令行打印编译后的SQL,同时在target/目录生成文件。举例:
sql
dbt compile --select "stg_orders"
dbt compile --inline "select * from {{ ref('raw_orders') }}"
输出结果如下:
sql
dbt compile --select "stg_orders"
21:17:09 Running with dbt=1.7.5
21:17:09 Registered adapter: postgres=1.7.5
21:17:09 Found 5 models, 3 seeds, 20 tests, 0 sources, 0 exposures, 0 metrics, 401 macros, 0 groups, 0 semantic models
21:17:09
21:17:09 Concurrency: 24 threads (target='dev')
21:17:09
21:17:09 Compiled node 'stg_orders' is:
with source as (
select * from "jaffle_shop"."main"."raw_orders"
),
renamed as (
select
id as order_id,
user_id as customer_id,
order_date,
status
from source
)
select * from renamed
sql
dbt compile --inline "select * from {{ ref('raw_orders') }}"
18:15:49 Running with dbt=1.7.5
18:15:50 Registered adapter: postgres=1.7.5
18:15:50 Found 5 models, 3 seeds, 20 tests, 0 sources, 0 exposures, 0 metrics, 401 macros, 0 groups, 0 semantic models
18:15:50
18:15:50 Concurrency: 5 threads (target='postgres')
18:15:50
18:15:50 Compiled inline node is:
select * from "jaffle_shop"."main"."raw_orders"
高级用法
dbt compile
命令访问数据平台以获取与缓存相关的元数据,并实现内省查询。
可以使用--no-populate-cache
标志来禁用初始缓存填充。如果需要元数据,则dbt在缓存中查询不到(缓冲丢失),需要dbt运行元数据查询。
也可以使用--no- introspection
标志来禁用内省查询。如果模型的定义需要运行内省查询,但启用了此标志,则dbt将引发错误。
总结
本文介绍了dbt compile
命令,包括应用场景、详细说明及注意事项。了解这些信息,有助于在项目中高效使用该命令。