SQLMesh 系列教程9- 宏變量及內置宏變量

SQLMesh 的宏變量是一個強大的工具,能夠顯著提高 SQL 模型的動態化能力和可維護性。通過合理使用宏變量,可以實現動態時間范圍、多環境配置、參數化查詢等功能,從而簡化數據模型的開發和維護流程。隨著數據團隊的規模擴大和業務復雜度的增加,宏變量的重要性將愈發凸顯。

在這里插入圖片描述

介紹宏變量

SQLMesh 是一個開源的數據轉換框架,旨在簡化 SQL 數據模型的設計、維護和部署流程。它通過引入 DevOps 最佳實踐,支持多引擎、虛擬環境和數據血緣分析等功能,幫助數據團隊高效管理數據模型。在 SQLMesh 中,宏變量(Macro Variables)是一個重要的特性,用于在 SQL 模型中實現動態化和可重用性。以下將詳細介紹 SQLMesh 的宏變量,并結合示例說明其用法和優勢。

宏變量的定義與作用

宏變量是 SQLMesh 中用于動態替換值的占位符,允許用戶在 SQL 模型中定義可重用的邏輯。它們的主要作用包括:

  • 動態化 SQL 邏輯:通過宏變量,可以在運行時動態替換 SQL 中的值,避免硬編碼。
  • 提高代碼復用性:將常用的邏輯封裝為宏變量,減少重復代碼。
  • 簡化維護:通過集中管理宏變量,降低維護成本。

SQLMesh 的宏變量通常以 @$ 開頭,并在 SQL 模型中被引用。宏變量的值可以在模型定義、運行時或配置文件中指定14。

宏變量的分類

在 SQLMesh 中,宏變量可以分為以下幾類:

  • 內置宏變量:SQLMesh 提供了一些預定義的宏變量,例如 @start_date@end_date,用于處理時間范圍相關的邏輯。
  • 用戶自定義宏變量:用戶可以根據需求定義自己的宏變量,并在 SQL 模型中引用。
  • 環境變量:SQLMesh 支持從環境變量中讀取值,并將其作為宏變量使用。

宏變量的使用場景

宏變量在 SQLMesh 中的應用場景非常廣泛,以下是一些典型用例:

  • 動態時間范圍:在增量模型中,使用 @start_date@end_date 動態指定時間范圍。
  • 多環境配置:通過宏變量區分開發、測試和生產環境,例如動態切換數據庫連接。
  • 參數化查詢:在查詢中使用宏變量實現參數化,避免 SQL 注入風險。
  • 代碼復用:將復雜的邏輯封裝為宏變量,供多個模型調用。

舉例說明

宏變量是占位符,其值在呈現宏時被替換。它們支持動態宏行為——例如,日期參數的值可能基于宏運行的時間。

考慮一個在WHERE子句中按日期過濾的SQL查詢。與每次運行模型時手動更改日期不同,您可以使用宏變量使日期動態。使用動態方法,日期會根據查詢的運行時間自動更改。

這個查詢過濾列my_date在‘2023-01-01’之后的行:

SELECT *
FROM table
WHERE my_date > '2023-01-01'

要使這個查詢的日期動態,你可以使用預定義的SQLMesh宏變量@execution_ds:

SELECT *
FROM table
WHERE my_date > @execution_ds

@符號告訴SQLMesh, @execution_ds是一個宏變量,需要在執行SQL之前進行替換。

宏變量@execution_ds是預定義的,因此它的值將由SQLMesh根據執行開始的時間自動設置。如果模型在2023年2月1日執行,呈現的查詢將是:

SELECT *
FROM table
WHERE my_date > '2023-02-01'

這個例子使用了SQLMesh的一個預定義變量,但是你也可以定義自己的宏變量。

我們將在下面描述SQLMesh的預定義變量;在SQLMesh宏和Jinja宏頁面中討論了用戶定義的宏變量。

內置宏變量

SQLMesh附帶了可以在查詢中使用的預定義變量。它們由SQLMesh運行時自動設置。

大多數預定義變量都與時間相關,并使用前綴(start、end等)和后綴(date、ds、ts等)的組合。它們將在下一節中描述;下一節將討論其他預定義變量。

時間變量

SQLMesh使用python datetime模塊來處理日期和時間。它使用標準的Unix紀元開始符1970-01-01。

前綴:

  • start - 包括模型運行的啟動區間
  • end - 包括模型運行的結束區間
  • execution - 執行開始的時間戳

后綴:

  • dt - Python 的 datetime 對象,可轉換為原生的 SQL TIMESTAMP(或等效的 SQL 引擎類型)
  • date - Python 的 date 對象,可轉換為原生的 SQL DATE
  • ds - 格式為 ‘%Y-%m-%d’ 的日期字符串
  • ts - 格式為 ‘%Y-%m-%d %H:%M:%S’ 的 ISO 8601 日期時間格式字符串
  • tstz - 格式為 ‘%Y-%m-%d %H:%M:%S%z’ 的帶有時區的 ISO 8601 日期時間格式字符串
  • hour - 表示一天中的小時數的整數,取值范圍為 0 到 23
  • epoch - 表示自 Unix 紀元以來的秒數的整數
  • millis - 表示自 Unix 紀元以來的毫秒數的整數

所有預定義的時間宏變量:

  • dt
    • @start_dt
    • @end_dt
    • @execution_dt
  • date
    • @start_date
    • @end_date
    • @execution_date
  • ds
    • @start_ds
    • @end_ds
    • @execution_ds
  • ts
    • @start_ts
    • @end_ts
    • @execution_ts
  • tstz
    • @start_tstz
    • @end_tstz
    • @execution_tstz
  • hour
    • @start_hour
    • @end_hour
    • @execution_hour
  • epoch
    • @start_epoch
    • @end_epoch
    • @execution_epoch
  • millis
    • @start_millis
    • @end_millis
    • @execution_millis

運行時變量

SQLMesh提供了另外兩個預定義變量,用于根據運行時可用的信息修改模型行為。

  • @runtime_stage — 字符串值,表示SQLMesh運行時的當前階段。通常在模型中用于有條件地執行pre/post語句(在這里了解更多)。它返回以下值之一:

    • loading - 項目正在加載到 SQLMesh 的運行時上下文中。

    • creating - 模型表正在創建。

    • evaluating - 模型查詢邏輯正在評估。

    • promoting - 模型正在目標環境中推廣(虛擬層更新)。

    • auditing - 正在運行審計。

    • testing - 模型查詢邏輯正在單元測試的上下文中評估。

  • @gateway — 包含當前網關名稱的字符串值。

  • @this_model — 字符串值,包含模型視圖選擇的物理表的名稱。通常用于創建通用審核。在on_virtual_update語句的情況下,它包含限定視圖名稱。

    • 當SQLGlot不能完全解析語句,需要直接引用模型的底層物理表時,可以在模型定義中使用。

    • 可以作為參數傳遞給訪問或與底層物理表交互的宏。

實戰案例

以下是一個完整的示例,展示如何在 SQLMesh 中使用宏變量實現動態時間范圍和多環境配置。

1. 項目配置
gateways:prod_gateway:connection:type: duckdbdatabase: prod.dbdev_gateway:connection:type: duckdbdatabase: dev.dbdefault_gateway: dev_gateway
2. 定義模型
MODEL (name example.incremental_model,owner Yuki,kind INCREMENTAL_BY_TIME_RANGE (time_column (updated_date, '%Y-%m-%d'),lookback 5,),start '2025-01-01',cron '@daily',grain id,column_descriptions (id = 'primary key',letter = 'alphabet letter',updated_date = 'updated date',)
);
3. 引用宏變量
SELECTid,letter,updated_date
FROMexample.base_model
WHEREupdated_date BETWEEN @start_date AND @end_dateAND @gateway = 'prod_gateway';
4. 運行計劃
sqlmesh plan --gateway prod_gateway

最后總結

SQLMesh 的宏變量是用于動態替換值的占位符,允許用戶在 SQL 模型中定義可重用的邏輯。它們的主要作用包括動態化 SQL 邏輯、提高代碼復用性和簡化維護。SQLMesh 的宏變量可以分為內置宏變量、用戶自定義宏變量和環境變量。宏變量在 SQLMesh 中的應用場景非常廣泛,包括動態時間范圍、多環境配置、參數化查詢和代碼復用。通過合理使用宏變量,可以顯著提高 SQL 模型的動態化能力和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896283.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896283.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鵬哥c語言數組(初階數組)

前言: 對應c語言視頻54集 內容: 一維數組的創建 數組是一組相同元素的集合, 數組的創建方式 type_t就是數組的元素類型,const_n是一個常量表達式,用來指定數組的大小 c99標準之前的,數組的大小必須是…

爬蟲運行后如何保存數據?

爬蟲運行后,將獲取到的數據保存到本地或數據庫中是常見的需求。Python 提供了多種方式來保存數據,包括保存為文本文件、CSV 文件、JSON 文件,甚至存儲到數據庫中。以下是幾種常見的數據保存方法,以及對應的代碼示例。 1. 保存為文…

計算機視覺:經典數據格式(VOC、YOLO、COCO)解析與轉換(附代碼)

第一章:計算機視覺中圖像的基礎認知 第二章:計算機視覺:卷積神經網絡(CNN)基本概念(一) 第三章:計算機視覺:卷積神經網絡(CNN)基本概念(二) 第四章:搭建一個經典的LeNet5神經網絡(附代碼) 第五章&#xff1…

linux--多進程基礎(2)GDB多進程調試(面試會問)

將其中的命令記住就行。 總結:GDB下默認調試父進程,可以設置調試父進程還是子進程,也可以設置調試模式,調試模式默認是on即一個在調試另一個直接運行,off就是另一個進程掛起,最后可以查看調試進程 一般默認…

Cramér-Rao界:參數估計精度的“理論底線”

Cramr-Rao界:參數估計精度的“理論底線” 在統計學中,當我們用數據估計一個模型的參數時,總希望估計結果盡可能精確。但精度有沒有一個理論上的“底線”呢?答案是有的,這就是Cramr-Rao界(Cramr-Rao Lower …

【復習】Redis

數據結構 Redis常見的數據結構 String&#xff1a;緩存對象Hash&#xff1a;緩存對象、購物車List&#xff1a;消息隊列Set&#xff1a;點贊、共同關注ZSet&#xff1a;排序 Zset底層&#xff1f; Zset底層的數據結構是由壓縮鏈表或跳表實現的 如果有序集合的元素 < 12…

Git add --- error: Filename too long

0 Preface/Foreword 1 解決辦法 git config --system core.longpaths true

在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解

文章目錄 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定義 Student 類2. 配置類&#xff1a;初始化 Bean3. 測試類&#xff1a;使用 Autowired 注解自動注入 Bean4. Spring Boot 的自動裝配5. 總結 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…

【AI+智造】DeepSeek價值重構:當采購與物控遇上數字化轉型的化學反應

作者&#xff1a;Odoo技術開發/資深信息化負責人 日期&#xff1a;2025年2月24日 引言&#xff1a;從事企業信息化工作16年&#xff0c;我見證過無數企業從手工臺賬到ERP系統的跨越。但真正讓采購和物控部門脫胎換骨的&#xff0c;是融合了Deepseek AI的Odoo數字化解決方案——…

qt-C++筆記之創建和初始化 `QGraphicsScene` 和 `QGraphicsView` 并關聯視圖和場景的方法

qt-C++筆記之創建和初始化 QGraphicsScene 和 QGraphicsView 并關聯視圖和場景的方法 code review! 參考筆記 1.qt-C++筆記之創建和初始化 QGraphicsScene 和 QGraphicsView 并關聯視圖和場景的方法 2.qt-C++筆記之QGraphicsScene和 QGraphicsView中setScene、通過scene得到vie…

Java Map實現類面試題

Java Map實現類面試題 HashMap Q1: HashMap的實現原理是什么&#xff1f; HashMap基于哈希表實現&#xff0c;使用數組鏈表紅黑樹&#xff08;Java 8&#xff09;的數據結構。 public class HashMapPrincipleExample {// 模擬HashMap的基本結構public class SimpleHashMap&…

Win32/ C++ 簡易對話框封裝框架(多語言, 通知欄菜單, 拖拽文件處理)

Win32 簡易對話框封裝簡易框架示例 1. 菜單操作: 多語言 2. 通知欄圖標菜單 3. 其他操作: 接受拖拽文件等等 CDialogFrame.h #pragma once #include "CWindow/CDialogBase.h" #include "CNSFHeader.h" #include "Win32Utils/CBytesUtils.h" …

如何在WordPress網站中查看移動版本—快速預覽與自定義設置

在WordPress網站的構建過程中&#xff0c;確保網站在移動端的顯示效果至關重要。畢竟&#xff0c;隨著越來越多的用戶通過手機訪問互聯網&#xff0c;一個優化良好的移動版網站將直接影響用戶的留存率和訪問體驗。 如果你是WordPress網站的所有者&#xff0c;本文將向你介紹如…

課程1. 深度學習簡介

課程1. 深度學習簡介 神經網絡結構邏輯回歸XOR問題&#xff08;異或問題&#xff09; 中間特征的生成全連接神經網絡中間網絡層的激活函數Sigmoid函數Tanh函數ReLU函數其它激活函數 使用全連接神經網絡解決 XOR 問題神經網絡用于回歸問題訓練神經網絡 不同類型的神經網絡 附加材…

Vue.js Vue 測試工具:Vue Test Utils 與 Jest

Vue.js Vue 測試工具&#xff1a;Vue Test Utils 與 Jest 在 Vue.js 的開發過程中&#xff0c;編寫和執行測試是確保應用質量和穩定性的關鍵步驟。Vue Test Utils 和 Jest 是 Vue.js 官方推薦的測試工具&#xff0c;二者結合使用&#xff0c;可以高效地進行單元測試和集成測試…

數據結構 1-2 線性表的鏈式存儲-鏈表

1 原理 順序表的缺點&#xff1a; 插入和刪除移動大量元素數組的大小不好控制占用一大段連續的存儲空間&#xff0c;造成很多碎片 鏈表規避了上述順序表缺點 邏輯上相鄰的兩個元素在物理位置上不相鄰 頭結點 L&#xff1a;頭指針 頭指針&#xff1a;鏈表中第一個結點的存儲…

各種以太坊Rollup技術

以太坊Rollup技術是一種通過將大量交易批處理并在主鏈上記錄較小的數據摘要來擴展以太坊網絡的方法。Rollup技術主要分為兩種類型&#xff1a;樂觀Rollup&#xff08;Optimistic Rollup&#xff09;和零知識Rollup&#xff08;ZK-Rollup&#xff09;。下面詳細介紹這兩種技術及…

Kubernetes開發環境minikube | 開發部署MySQL單節點應用

minikube是一個主要用于開發與測試Kubernetes應用的運行環境 本文主要描述在minikube運行環境中部署MySQL單節點應用 minikube start --force kubectl get nodes 如上所示&#xff0c;啟動minikube單節點運行環境 minikube ssh docker pull 如上所示&#xff0c;從MySQL官…

DeepSeek 助力 Vue 開發:打造絲滑的二維碼生成(QR Code)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

一文詳解U盤啟動UEFI/Legacy方式以及GPT/MBR關系

對于裝系統的老手而說一直想研究一下裝系統的原理&#xff0c;以及面對一些問題時的解決思路&#xff0c;故對以前的方法進行原理上的解釋&#xff0c;主要想理解其底層原理。 引導模式 MBR分區可以同時支持UEFI和Legacy引導&#xff0c;我們可以看一下微pe制作的啟動盤&#…