首页 > 其他分享 >dbt statement macro 简单说明

dbt statement macro 简单说明

时间:2024-04-04 09:11:36浏览次数:34  
标签:%- -% macro result statement dbt

statement blocks 实际上就是一个标准的jinja2 macro 调用包装, 提供了方便的sql 执行能力,因为需要进行
查询结果的存储,dbt 提供了一个store_result 的macro,内部数据的处理基于了agate 这个方便的python 数据处理包
为了查询使用提供了load_result macro
以下只说明关于statement部分,store_result 以及load_result macro 后边单独说明

statement 处理

statement macro 是在dbt-adapter 包中,实现内在dbt core 中,dbt-adapter 包含了dbt 的global macro (package 为dbt)

  • 参考使用
# 定义查询
{%- call statement('states', fetch_result=True) -%}
 
    select distinct state from {{ ref('users') }}
 
{%- endcall -%}
# 获取数据
{%- set states = load_result('states') -%}
{%- set states_data = states['data'] -%}
{%- set states_status = states['response'] -%}
  • 参考代码
{#--
The macro override naming method (spark__statement) only works for macros which are called with adapter.dispatch. For macros called directly, you can just redefine them.
--#}
{%- macro statement(name=None, fetch_result=False, auto_begin=True, language='sql') -%}
  {%- if execute: -%}
   # 通过caller获取传递的sql 
    {%- set compiled_code = caller() -%}
 
    {%- if name == 'main' -%}
      {{ log('Writing runtime {} for node "{}"'.format(language, model['unique_id'])) }}
      {{ write(compiled_code) }}
    {%- endif -%}
    {%- if language == 'sql'-%}
     # 执行sql 查询,adapter macro 的execute
      {%- set res, table = adapter.execute(compiled_code, auto_begin=auto_begin, fetch=fetch_result) -%}
    {%- elif language == 'python' -%}
       # 执行python 代码处理
      {%- set res = submit_python_job(model, compiled_code) -%}
      {#-- TODO: What should table be for python models? --#}
      {%- set table = None -%}
    {%- else -%}
      {% do exceptions.raise_compiler_error("statement macro didn't get supported language") %}
    {%- endif -%}
 
    {%- if name is not none -%}
      # 存储结果
      {{ store_result(name, response=res, agate_table=table) }}
    {%- endif -%}
 
  {%- endif -%}
{%- endmacro %}
   
{% macro noop_statement(name=None, message=None, code=None, rows_affected=None, res=None) -%}
  {%- set sql = caller() -%}
 
  {%- if name == 'main' -%}
    {{ log('Writing runtime SQL for node "{}"'.format(model['unique_id'])) }}
    {{ write(sql) }}
  {%- endif -%}
 
  {%- if name is not none -%}
    {{ store_raw_result(name, message=message, code=code, rows_affected=rows_affected, agate_table=res) }}
  {%- endif -%}
 
{%- endmacro %}
 
# run_query 友好包装
{# a user-friendly interface into statements #}
{% macro run_query(sql) %}
  {% call statement("run_query_statement", fetch_result=true, auto_begin=false) %}
    {{ sql }}
  {% endcall %}
 
  {% do return(load_result("run_query_statement").table) %}
{% endmacro %}

说明

官方推荐通过run_query 对于statement 进行替换,run_query 是statement的包装使用上更加方便

参考资料

dbt/include/global_project/macros/etc/statement.sql
core/dbt/context/providers.py
https://docs.getdbt.com/reference/dbt-jinja-functions/run_query
https://docs.getdbt.com/reference/dbt-jinja-functions/statement-blocks
https://jinja.palletsprojects.com/en/3.0.x/templates/#call
https://agate.readthedocs.io/en/latest/
https://github.com/wireservice/agate

标签:%-,-%,macro,result,statement,dbt
From: https://www.cnblogs.com/rongfengliang/p/18096996

相关文章

  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
    ElixirMacros系列文章译文[1](译)UnderstandingElixirMacros,Part1Basics[2](译)UnderstandingElixirMacros,Part2-MacroTheory[3](译)UnderstandingElixirMacros,Part3-GettingintotheAST[4](译)UnderstandingElixirMacros,Part4-Div......
  • (译) 理解 Elixir 中的宏 Macro, 第三部分:深入理解 AST
    ElixirMacros系列文章译文[1](译)UnderstandingElixirMacros,Part1Basics[2](译)UnderstandingElixirMacros,Part2-MacroTheory[3](译)UnderstandingElixirMacros,Part3-GettingintotheAST[4](译)UnderstandingElixirMacros,Part4-Div......
  • (译) 理解 Elixir 中的宏 Macro, 第二部分:宏理论
    ElixirMacros系列文章译文[1](译)UnderstandingElixirMacros,Part1Basics[2](译)UnderstandingElixirMacros,Part2-MicroTheory[3](译)UnderstandingElixirMacros,Part3-GettingintotheAST[4](译)UnderstandingElixirMacros,Part4-Div......
  • dbt macro 的执行简单说明
    BaseAdapter中包含了一个adapter实际运行依赖的转换,链接处理,当然也包含了macro的执行,具体方法有直接的execute_macroModelRunner中的materialization_macro(run命令)还有run-operation中RunOperationTask的_run_unsafe方法ModelRunnercall_macro处理参考调用......
  • dbt this macro 处理简单说明
    dbtthismacro提供了一种方便的对于当前模型展现的方法,可以使用在增量模型以及pre&posthooks中this实际是就类似ref('<the_current_model>')是一个relation包含了database,schema以及模型标识使用示例一个增量处理的,基于this可以方便的引用模型{{config(mater......
  • dbt return macro 内部实现简单说明
    jinja2默认是没有returnmacro的,dbt在实现的时候比较有意思,通过一个exception触发的,以下是简单说明参考使用一个包含return的macro{%macrodemoapp(name,version)%}{%ifversion=='v1'%}{{return("appdemo")}}{%else%}......
  • jinja2 通过Template. make_module 进行动态macro 创建以及macro 方法调用
    实际属于一个小技巧,可以实现比较灵活的jinja2扩展,是从dbt对于macro的处理部分学习到的参考代码app.pyfromjinja2importEnvironment env=Environment() #定义macro的内容macro_template="""{%macromydemo(name,age)-%}{{name......
  • 从零开始的 dbt 入门教程 (dbt cloud 自动化篇)
    一、引在前面的几篇文章中,我们从dbtcore聊到了dbt项目工程化,我相信前几篇文章足够各位数据开发师从零快速入门dbt开发,那么到现在我们更迫切需要解决的是如何让数据更新做到定时化,毕竟作为开发我们肯定没有经历每天定点去手动运行dbt命令,那么今天我们将带领大家快速上手......
  • 02 Statement和PreparedStatement
    文章目录StatementPreparedStatementStatement(1)相同的SQL语句,重复执行第n次,编译n次—效率低(2)Statementsql中的参数赋值直接通过字符串拼接,可能会有非法sql注入,导致数据泄露importjava.sql.*;importjava.util.Scanner;publicclassLogin{pu......
  • Using the TRACE_EVENT() macro (Part 1)
    如果你对tracepoint后面的机制感兴趣,可以阅读关于TRACE_EVENT的三篇文章。这一系列文章对tracepoint后面的机制进行了详细讲解,以及其使用方法都有涉及。该系列文章出现在lwn.net上。注意,不要被英文吓住了,我保证,你认真读完这系列文章后,tracepoint后面的秘密不在是秘密。Using......