探索SQLMesh中的Jinja宏:提升SQL查詢的靈活性與復用性

在數據工程和數據分析領域,SQL是不可或缺的工具。隨著項目復雜度的增加,如何高效地管理和復用SQL代碼成為了一個重要課題。SQLMesh作為一款強大的工具,不僅支持標準的SQL語法,還引入了Jinja模板引擎的宏功能,極大地提升了SQL查詢的靈活性和復用性。本文將深入探討SQLMesh中Jinja宏的使用方法及其優勢。

在這里插入圖片描述

什么是Jinja宏?

Jinja是一個流行的Python模板引擎,廣泛用于Web開發中生成動態HTML內容。然而,Jinja的宏功能并不僅限于Web開發,它同樣適用于SQL查詢的構建。Jinja的宏通過字符串替換的方式工作,與SQLMesh的宏不同,它不構建語義表示,而是直接組裝SQL查詢文本。
在這里插入圖片描述

Jinja的基本語法

Jinja使用大括號 {} 來區分宏和非宏文本。具體來說:

  • {{...}} 創建Jinja表達式,用于插入變量或函數的結果。
  • {%...%} 創建Jinja語句,用于控制流程、設置變量等。
  • {#...#} 創建Jinja注釋,不會出現在渲染后的SQL查詢中。

在SQLMesh中使用Jinja宏

為了確保SQLMesh能夠正確解析包含Jinja宏的SQL查詢,必須將模型查詢包裹在特殊的 JINJA_QUERY_BEGIN; ...; JINJA_END; 塊中。例如:

MODEL (name sqlmesh_example.full_model);
JINJA_QUERY_BEGIN;
SELECT {{ 1 + 1 }};
JINJA_END;

如果需要在模型查詢之前或之后執行某些操作,可以使用 JINJA_STATEMENT_BEGIN; ...; JINJA_END; 塊:

MODEL (name sqlmesh_example.full_model);
JINJA_STATEMENT_BEGIN;
{{ pre_hook() }}
JINJA_END;
JINJA_QUERY_BEGIN;
SELECT {{ 1 + 1 }};
JINJA_END;
JINJA_STATEMENT_BEGIN;
{{ post_hook() }}
JINJA_END;

SQLMesh預定義變量

SQLMesh提供了一些預定義變量,幫助用戶更好地管理和構建SQL查詢:

  • 項目相關變量:如 runtime_stagethis_model,提供關于SQLMesh項目本身的信息。
  • 時間相關變量:如 start_dsexecution_date,用于構建增量模型查詢,僅在增量模型類型中可用。

使用這些變量時,需用大括號 {} 包裹變量名,并根據返回值類型決定是否加單引號。例如:

JINJA_QUERY_BEGIN;
SELECT * FROM table WHERE time_column BETWEEN '{{ start_ds }}' AND '{{ end_ds }}';
JINJA_END;

用戶自定義變量

SQLMesh支持兩種用戶自定義宏變量:全局變量和局部變量。

全局變量

全局變量在項目配置文件中定義,可以在任何項目模型中訪問。使用 var 函數獲取全局變量的值,并可指定默認值以防止變量未定義的情況。例如:

JINJA_QUERY_BEGIN;
SELECT * FROM table WHERE int_variable = {{ var('int_var') }};
JINJA_END;

如果變量可能未定義,可以提供默認值:

JINJA_QUERY_BEGIN;
SELECT * FROM table WHERE some_value = {{ var('missing_var', 0) }};
JINJA_END;

局部變量

局部變量在模型定義中使用Jinja的 {% set %} 語句定義,僅在該模型中有效。例如:

MODEL (name sqlmesh_example.full_model, kind FULL, cron '@daily', audits(assert_positive_order_ids));
JINJA_QUERY_BEGIN;
{% set my_col = 'num_orders' %}
SELECT item_id, count(distinct id) AS {{ my_col }}
FROM sqlmesh_example.incremental_model
GROUP BY item_id
JINJA_END;

Jinja控制流與循環

Jinja提供了強大的控制流和循環功能,可以簡化重復代碼的編寫。

For循環

通過 {% for %} 語句,可以輕松迭代集合中的項目。例如,創建多個條件變量:

SELECT
{% for vehicle_type in ['car', 'truck', 'bus'] %}CASE WHEN user_vehicle = '{{ vehicle_type }}' THEN 1 ELSE 0 END AS vehicle_{{ vehicle_type }},
{% endfor %}
FROM table

為了提高代碼的可維護性,建議將列表定義在循環外部:

{% set vehicle_types = ['car', 'truck', 'bus'] %}
SELECT
{% for vehicle_type in vehicle_types %}CASE WHEN user_vehicle = '{{ vehicle_type }}' THEN 1 ELSE 0 END AS vehicle_{{ vehicle_type }},
{% endfor %}
FROM table

If語句

{% if %} 語句允許根據條件執行不同的操作。例如,僅在測試模式下包含特定列:

{% set testing = True %}
SELECT normal_column,
{% if testing %}testing_column
{% endif %}
FROM table

在上述例子中,如果 testingTrue,則渲染后的查詢將包含 testing_column

用戶自定義宏函數

Jinja宏函數允許在多個模型中復用相同的宏代碼。宏函數應定義在SQLMesh項目 macros 目錄下的 .sql 文件中。

定義宏函數

使用 {% macro %}{% endmacro %} 語句定義宏函數。例如,定義一個簡單的打印文本的宏:

{% macro print_text() %}
text
{% endmacro %}

在SQL模型中調用該宏:

{{ print_text() }}

渲染后的查詢將包含 "text"

帶參數的宏函數

宏函數可以接受參數,增強其靈活性。例如,生成帶有別名的SQL列:

{% macro alias(expression, alias) %}{{ expression }} AS {{ alias }}
{% endmacro %}

在SQL查詢中使用:

SELECT item_id, {{ alias('item_id', 'item_id2') }} FROM table

渲染后的查詢為:

SELECT item_id, item_id AS item_id2 FROM table

需要注意的是,Jinja在渲染過程中會根據上下文識別參數類型。如果需要將表達式作為字符串處理,可以使用雙引號:

SELECT item_id, {{ alias("'item_id'", 'item_id2') }} FROM table

渲染結果為:

SELECT item_id, 'item_id' AS item_id2 FROM table

最后總結

SQLMesh支持同時使用Jinja和SQLMesh的宏系統。然而,強烈建議在一個模型中僅使用一種宏系統,以避免潛在的沖突和不可預見的行為。預定義的SQLMesh宏變量可以在包含用戶自定義Jinja變量和函數的查詢中使用,但傳遞給Jinja宏函數的預定義變量必須使用Jinja的大括號語法。

通過引入Jinja宏,SQLMesh為數據工程師和分析師提供了更強大的工具來管理和復用SQL代碼。無論是通過預定義變量簡化動態查詢的構建,還是通過自定義宏函數提升代碼的復用性,Jinja宏都極大地提升了SQL查詢的靈活性和可維護性。掌握這些功能,將幫助您在復雜的數據項目中更加高效地工作。

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

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

相關文章

MySQL的深度分頁如何優化?

大家好,我是鋒哥。今天分享關于【MySQL的深度分頁如何優化?】面試題。希望對大家有幫助; MySQL的深度分頁如何優化? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 MySQL的深度分頁在處理大數據量時可能會導致性能瓶頸,特別是在…

SpringBoot3集成Mybatis

文章目錄 基礎使用代碼1. 創建Spring Boot 3項目并添加依賴2. 配置數據庫連接3. 創建實體類4. 創建Mapper接口5. 創建Service層6. 創建Controller層7. 主應用類 踩坑記錄1. 依賴版本不兼容2. Mapper接口掃描問題3. 數據庫連接問題4. Java版本問題 心得體會 基礎使用代碼 1. 創…

汽車加氣站操作工考試知識點總結

汽車加氣站操作工考試知識點總結 加氣站基本知識 了解加氣站類型(CNG、LNG、LPG等)及其特點。 熟悉加氣站的主要設備,如儲氣瓶組、壓縮機、加氣機、卸氣柱、安全閥等。 掌握加氣站工藝流程,包括卸氣、儲氣、加壓、加氣等環節。…

88、合并兩個有序數組

題目描述 給你兩個按 非遞減順序 排列的整數數組 nums1 和 nums2,另有兩個整數 m 和 n ,分別表示 nums1 和 nums2 中的元素數目。 請你 合并 nums2 到 nums1 中,使合并后的數組同樣按 非遞減順序 排列。 注意:最終,…

在ubuntu的docker上常用的docker命令

在 Ubuntu 系統上使用 Docker 時,以下是最常用的前 200 個 Docker 命令,并按類別進行分類。這些命令涵蓋了 Docker 的基本操作、管理容器、鏡像、網絡、卷等方面的功能,適用于日常使用和高級管理任務。 1. 基本命令 這些是與 Docker 交互的基…

ICode國際青少年編程競賽—Python—4級訓練場—復雜嵌套循環

ICode國際青少年編程競賽—Python—4級訓練場—復雜嵌套循環 icode練習時遇到卡頓沒有思路時怎么辦,題目也很難找到不會的那道題~針對這個問題,我們開發了通過“步數”、“積木行數”來快速定位到你不會的題目~ 題目會持續更新…

交替序列長度的最大值

1、題目描述 給出n個正整數,你可以隨意從中挑選一些數字組成 一段序列S,該序列滿足以下兩個條件: 1.奇偶交替排列:例如:"奇,偶,奇,偶,奇.…" 或者 "偶&a…

電機試驗平臺:功能架構與關鍵技術介紹

電機試驗平臺作為電機研發、生產和質量控制的核心設備,其設計與應用直接關系到電機性能測試的準確性和效率。隨著工業自動化、新能源汽車等領域的快速發展,對電機性能的要求日益提高,電機試驗平臺的設計也需不斷優化以適應多樣化需求。以下從…

ubuntu修改時區和設置24小時格式時間

ubuntu修改時區和設置24小時格式時間 一、修改時區二、設置24小時格式時間endl 一、修改時區 使用timedatectl命令更改當前時區為東八區[rootubuntu24-16:~]# timedatectl list-timezones | grep -i shanghai Asia/Shanghai [rootubuntu24-16:~]# timedatectl set-timezone As…

【IP101】圖像分割技術全解析:從傳統算法到深度學習的進階之路

圖像分割詳解 ?? 歡迎來到圖像處理的"手術室"!在這里,我們將學習如何像外科醫生一樣精準地"切割"圖像。讓我們一起探索這個神奇的圖像"手術"世界吧!🏥 目錄 📑 1. 圖像分割簡介2. 閾…

URL混淆與權限繞過技術

一、漏洞原理 前后端路徑解析邏輯不一致 后端框架(Spring/Shiro)自動處理特殊字符(../、//),但鑒權組件(如Filter)未規范化原始URI。 示例:/system/login/../admin被Filter誤判為白…

Redis卸載重裝教程

卸載 找到redis安裝目錄 cmd打開該目錄,輸入 redis-server --service-uninstall運行結果如下 最后再刪除redis文件夾即可(如果顯示該文件夾已在其他地方被打開而無法刪除,可以重啟一下電腦,就能正常刪除啦) 安裝R…

使用OpenCV 和 Dlib 實現人臉融合技術

文章目錄 引言一、技術概述二、環境準備三、關鍵代碼解析1. 人臉關鍵點定義2. 獲取人臉掩模3. 計算仿射變換矩陣4. 檢測并提取人臉關鍵點5. 顏色校正 四、完整流程五、效果展示六、總結 引言 本文將介紹如何使用Python、OpenCV和dlib庫實現人臉融合技術,將一張人臉…

skywalking服務安裝與啟動

skywalking服務安裝并啟動 1、介紹2、下載apache-skywalking-apm3、解壓縮文件4、創建數據庫及用戶5、修改配置文件6、下載 MySQL JDBC 驅動7、啟動 OAP Serve,需要jkd11,需指定jkd版本,可以修改文件oapService.sh8、啟動 Web UI,需要jkd11,需指定jkd版本,可以修改文件oapServi…

計算方法實驗四 解線性方程組的間接方法

【實驗性質】 綜合性實驗。 【實驗目的】 掌握迭代法求解線性方程組。 【實驗內容】 應用雅可比迭代法和Gauss-Sediel迭代法求解下方程組: 【理論基礎】 線性方程組的數值解法分直接算法和迭代算法。迭代法將方程組的求解轉化為構造一個向量序列&…

G919-GAS軟件 JSON格式數據通訊協議-陣列數據解析

G919-GAS軟件 JSON格式數據通訊協議-陣列數據解析 版本記錄 DateAuthorVersionNote2024.04.07Dog TaoV1.0發布通訊協議。2025.05.06Dog TaoV1.11. 增加了【高速采樣】模式下的通訊協議。2. 增加了“軟件開發建議”小節。 文章目錄 G919-GAS軟件 JSON格式數據通訊協議-陣列數據…

TCGA數據庫臨床亞型可用!貝葉斯聚類+特征網絡分析,這篇 NC 提供的方法可以快速用起來了!

生信堿移 貝葉斯網絡聚類 CANclust是一種基于貝葉斯的聚類方法,系統性地對基因突變、細胞遺傳學信息和臨床指標進行聯合建模,用于多種模態數據的聯合聚類分析,并識別在患者群體中反復出現的特征模式。 個體的遺傳與環境背景決定其應對疾病的…

【算法】隨機快速排序和隨機選擇算法

文章目錄 1、隨機快速排序1.1 什么是隨機快排1.2 隨機快排的好處 2、隨機選擇算法 前言: 快速排序就是每次劃分前,通過一種方法將一個基準值的位置確定好,再進入不同的部分重復相同的工作以此確定好每個值的位置以達到有序。如果你之前并不了…

網絡技術基礎,NAT,橋接,交換機,路由器

什么是NAT Network Address Translation(網絡地址轉換),它負責將目標IP或源IP進行了改變,相當于一個中間代理,我們家庭常用的路由器就是一個NAT設備,NAT是為了解決IPv4的IP地址快要耗盡的問題,…

DVWA靶場保姆級通關教程--03CSRF跨站請求偽造

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 目錄 文章目錄 前言 一、low級別的源碼分析 二、medium級別源碼分析 安全性分析 增加了一層 Referer 驗證: 關鍵點是:在真實的網絡環境中&a…