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 模型的动态化能力和可维护性。
相关文章:
SQLMesh 系列教程9- 宏变量及内置宏变量
SQLMesh 的宏变量是一个强大的工具,能够显著提高 SQL 模型的动态化能力和可维护性。通过合理使用宏变量,可以实现动态时间范围、多环境配置、参数化查询等功能,从而简化数据模型的开发和维护流程。随着数据团队的规模扩大和业务复杂度的增加&…...
【Deepseek】Linux 本地部署 Deepseek
前言 本文介绍在 Linux 系统上部署 Deepseek AI。本文教程是面向所有想体验 AI 玩家的一个简易教程,因此即使是小白也可以轻松完成体验,话不多说立马着手去干。 [注]:笔者使用的系统为 Ubuntu 24.10 1. 关于 ollama Ollama 是一款开源应用…...
机器学习数学通关指南——拉格朗日乘子法
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 拉格朗日乘子法…...
git,bash - 从一个远端git库只下载一个文件的方法
文章目录 git,bash - 从一个远端git库只下载一个文件的方法概述笔记写一个bash脚本来自动下载get_github_raw_file_from_url.shreanme_file.shfind_key_value.sh执行命令 END git,bash - 从一个远端git库只下载一个文件的方法 概述 github上有很多大佬上传了电子书库…...
臻识相机,华夏相机,芊熠车牌识别相机加密解密
臻识,华夏,芊熠这三种车牌识别相机解密我都试过了,可以正常解密成功,其它品牌我暂时没有测试。超级简单,免费的,白嫖无敌! 流程: ①:先导出配置文件,例如我以…...
网络安全与措施
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 # 网络安全问题概述 1) 数据安全 访问(授权访问);存储(容灾、备份或异地备份等) 2) 应用程序 不能…...
前后端分离系统架构:基于Spring Boot的最佳实践
前后端分离系统架构图描绘了一个基于Springboot的前端后台分离的系统架构。它强调了前端(客户端)与远程(服务器)的解耦,通过API接口进行交互,分别独立开发和部署。 前后端分离系统架构图 从上到下ÿ…...
提示语链与CIRS模型:解锁AI内容生成的新范式
文章目录 一、提示语链:从单点提示到系统化引导1.1 什么是提示语链?1.2 提示语链的核心特征1.3 提示语链的设计步骤1.4 提示语链的优势 二、CIRS模型:从上下文到综合优化2.1 什么是CIRS模型?2.2 CIRS模型的四个环节2.3 CIRS模型的…...
【Python + STM32 实现外设控制的从0-1实例教程-适合新手】
一、环境搭建与固件烧录 1. 硬件准备 STM32开发板:推荐支持 MicroPython 的型号(如STM32F4 Discovery、NUCLEO-F411RE)。USB转TTL模块:用于串口通信(如CH340、CP2102)。外设模块:LED、温湿度传感器(如DHT11)等。2. 软件准备 MicroPython固件:从MicroPython官网下载对…...
内外网文件传输 安全、可控、便捷的跨网数据传输方案
一、背景与痛点 在内外网隔离的企业网络环境中,员工与外部协作伙伴(如钉钉用户)的文件传输面临以下挑战: 安全性风险:内外网直连可能导致病毒传播、数据泄露。 操作繁琐:传统方式需频繁切换网络环境&…...
超导量子计算机的最新进展:走向实用化的量子革命
超导量子计算机的最新进展:走向实用化的量子革命 大家好,我是 Echo_Wish,今天我们来聊聊科技圈最炙手可热的话题之一——超导量子计算机。近年来,量子计算领域可谓是风起云涌,而超导量子计算机作为主流路线之一,已经在学术界和工业界取得了不少突破性进展。 那么,超导…...
DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发
Spring Boot 实现 DeepSeek API 调用 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…...
Oracle:执行DELETE语句长时间无响应的排查步骤及解决方案
目录 [TOC](目录)**一、检查锁状态与阻塞会话****二、检查未提交事务****三、分析执行计划与SQL性能****四、检查触发器与约束****五、资源竞争与系统瓶颈****六、其他高级排查手段****七、紧急处理流程****总结** 以下是针对Oracle执行DELETE语句长时间无响应的排查步骤及解决…...
centos服务器巡检脚本
服务器巡检脚本 系统负载shell脚本python将txt文件转换成excel,不正常巡检结果标记红色 系统负载shell脚本 #!/bin/bash#文件路径 path"/root/monitor.txt"#yum -y install bc sysstat net-tools lrzsz #获取主机名 system_hostname$(hostname | awk {pr…...
抖音试水AI分身;腾讯 AI 战略调整架构;百度旗下小度官宣接入DeepSeek...|网易数智日报
抖音试水AI分身,字节旗下AI智能体平台扣子已与抖音打通,相关功能内测中 2月19日消息,钛媒体App独家获悉,字节旗下AI智能体开发平台扣子(Coze)已与抖音打通,抖音创作者可在扣子智能体平台打造AI分…...
红帽7基于kickstart搭建PXE环境
Kickstart 文件是一种配置文件,用于定义 Linux 系统安装过程中的各种参数,如分区、网络配置、软件包选择等。system-config-kickstart 提供了一个图形界面,方便用户快速生成这些配置文件。 用户可以通过图形界面进行系统安装的详细配置&…...
安装PHPStudy 并搭建DVWA靶场
目录 一、PHPStudy 简介 二、DVWA 简介 三、安装 PHPStudy 四:安装 DVWA 一、PHPStudy 简介 phpstudy傻瓜式的一键启动,支持WAMP、WNMP、LAMP、LNMP,一键切换环境(nginxapahce),一键切换PHP版本(5.1-7…...
【量化科普】Liquidity,流动性
【量化科普】Liquidity,流动性 🚀量化软件开通 🚀量化实战教程 在量化交易的世界里,流动性(Liquidity)是一个至关重要的概念。它描述的是资产能够以多快的速度被买入或卖出而不显著影响其价格的能力。简…...
SQL写法技巧
目录 1.批量插入,查询,删除数据 缺点 实现方法 1.批量插入数据 2.批量查询数据 3.批量删除数据 4.批量修改数据 解释 2.树型表查询 方法一:递归(适用于多级的情况) 方法二:表的自连接 方法三:MySQL递归&am…...
Ryu:轻量开源,开启 SDN 新程
1. Ryu 控制器概述 定位:轻量级、开源的SDN控制器,专为开发者和研究人员设计,基于Python实现。开发者:由日本NTT实验室主导开发,遵循Apache 2.0开源协议。核心理念:简化SDN应用开发,提供友好的…...
【核心算法篇十四】《深度解密DeepSeek量子机器学习:VQE算法加速的黑科技与工程实践》
在经典计算机逼近物理极限的今天,量子计算正以指数级加速潜力颠覆传统计算范式。想象一下,一个需要超级计算机运算千年的化学分子模拟问题,用量子计算机可能只需几分钟——这就是DeepSeek团队在VQE(Variational Quantum Eigensolver)算法加速实践中创造的奇迹。根据,VQE作…...
“国补”带火手机换新,出售旧手机应如何保护个人信息安全
在“国补”政策的推动下,手机换新热潮正席卷而来。“国补”以其诱人的补贴力度,成功激发了消费者更换手机的热情。无论是渴望体验最新技术的科技爱好者,还是对旧手机性能不满的普通用户,都纷纷投身到这场手机换新的浪潮之中。 随着大量消费者参与手机换新,二手手机市场迎来…...
数据结构:基数排序(c++实现)
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 基数排序的定义和基本原理基本原理具体步骤 基数排序的优缺点:代码实现总结 基数排序的定义和基本原理 基数排序(Radix Sort)是一…...
eNSP下载安装(eNsp、WinPcap、Wireshark、VirtualBox下载安装)
一、下载 下载网址:https://cloud.grbj.cn/softlink/eNSP%20V100R003C00SPC100%20Setup.exe 备用临时网址:https://linshi.grbj.cn/abdpana/softlink 二、准备工作 系统要求 关闭防火墙 三、安装 3.1安装WinPcap 基本都是下一步,双击&…...
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…...
Linux 权限系统和软件安装(二):深入理解 Linux 权限系统
在 Linux 的世界里,权限系统犹如一位忠诚的卫士,严密守护着系统中的文件与目录,确保只有具备相应权限的用户才能进行操作。与其他一些操作系统不同,Linux 并不依据文件后缀名来标识文件的操作权限,而是构建了一套独特且…...
Windows 中的启动项如何打开?管理电脑启动程序的三种方法
在日常使用电脑时,我们经常会发现一些应用程序在开机时自动启动,这不仅会拖慢系统的启动速度,还可能占用不必要的系统资源。幸运的是,通过几个简单的步骤,你可以轻松管理这些开机自启的应用程序。接下来,我…...
uniapp邪门事件
很久之前在这篇《THREEJS 在 uni-app 中使用(微信小程序)》:THREEJS 在 uni-app 中使用(微信小程序)_uni-app_帶刺的小葡萄-华为开发者空间 中学到了如何在uniapp的微信小程序里接入three.js的3d模型 由于小程序自身很…...
DeepSeek学习教程 从入门到精通pdf下载:快速上手 DeepSeek
下载链接:DeepSeek从入门到精通(清华大学).pdf 链接: https://pan.baidu.com/s/1Ym0-_x9CrFHFld9UiOdA5A 提取码: 2ebc 一、DeepSeek 简介 DeepSeek 是一款由中国团队开发的高性能大语言模型,具备强大的推理能力和对中文的深刻理解。它广泛应用于智能办…...
MATLAB进阶之路:数据导入与处理
在MATLAB的学习旅程中,我们已经初步了解了它的基础操作。如今,我们将沿着这条充满惊喜的道路,迈向下一个重要的站点——数据导入与处理。这部分内容就像是为MATLAB注入了强大的能量,使其能够从现实的数据世界中汲取信息,然后像一位智慧的魔法师一样,巧妙地处理这些数据,…...
