SQLMesh 系列教程:解锁SQLMesh的宏与变量魔法
在数据库流水线开发中,代码复用与动态配置是提升效率的核心诉求。SQLMesh以其独特的宏系统与用户定义变量机制,重新定义了SQL生成的灵活性。与传统模板引擎不同,SQLMesh的宏并非简单的字符串替换,而是基于语义理解的智能代码重构——通过
sqlglot
库解析SQL结构,结合Python逻辑处理能力,让用户能够以声明式语法实现复杂查询的动态组装。
引言
无论是全局配置、网关级参数还是模型内局部变量,SQLMesh的三层变量体系(Global > Gateway > Local)提供了细粒度的数据管控能力。通过@DEF
宏定义和@VAR()
函数调用,开发者可以轻松将业务规则、环境参数与SQL逻辑解耦,实现“一次编写,多环境适配”。而宏函数的引入更进一步,允许将条件判断、数学计算等逻辑封装为可复用的代码片段,彻底告别重复代码。例如,通过嵌套宏函数@container_volume
调用@area
,SQLMesh不仅生成最终SQL,更赋予代码可读性与可维护性。
宏系统:两种方法
SQLMesh 中的宏与像 Jinja 这样的模板系统的宏表现不同。
宏系统基于字符串替换。宏系统会扫描代码文件,识别表示宏内容的特殊字符,并将宏元素替换为其他文本。
从广义上讲,这就是模板系统的全部功能。它们具有提供控制流逻辑(if-then)和其他功能的工具,但这些功能仅用于支持替换正确的字符串。
模板系统有意对所使用的编程语言保持中立,大多数模板系统适用于从博客文章到 HTML 再到 SQL 的各种内容。相比之下,SQLMesh 宏专门设计用于生成 SQL 代码。它们通过使用 Python 的 sqlglot 库对正在创建的 SQL 代码进行分析,从而具有对 SQL 代码的语义理解,并且允许使用 Python 代码,这样用户就可以整洁地实现复杂的宏逻辑。
SQLMesh 宏方法
本节描述SQLMesh宏在底层是如何工作的。你可以随意跳过这一节,并在有用的时候返回。使用SQLMesh宏不需要此信息,但它对于调试任何表现出令人困惑行为的宏非常有用。
SQLMesh宏方法和模板系统之间的关键区别在于字符串替换所起的作用。在模板系统中,字符串替换是全部和唯一的要点。
在SQLMesh中,字符串替换只是修改SQL查询的语义表示的一个步骤。SQLMesh宏通过构建和修改SQL查询的语义表示来工作。
在处理完所有非sql文本之后,它使用替换的值将查询的语义表示修改为其最终状态。
它采用以下五个步骤来实现这一目标:
-
使用适当的 SQLGlot SQL 语境(例如,Postgres、BigQuery 等)解析文本。在解析过程中,它检测特殊宏符号 @ 以区分非 SQL 和 SQL 文本。解析器构建 SQL 代码结构的语义表示,将非 SQL 文本捕获为“占位符”值,以便在后续步骤中使用。
-
检查占位符值,将其分类为以下类型之一:
-
使用 @DEF 操作符创建用户自定义宏变量(有关用户自定义宏变量的更多信息请参阅后面章节)
-
宏变量:SQLMesh 预定义的、用户自定义的局部变量以及用户自定义的全局变量
-
宏函数,包括 SQLMesh 提供的以及用户自定义的
-
-
替换检测到的宏变量值。在大多数情况下,这是与模板系统一样的直接字符串替换。
-
执行任何宏函数并替换返回值。
-
用(3)中替换的变量值和(4)中的函数修改SQL查询的语义表示。
用户定义的变量
SQLMesh支持三种用户定义的宏变量:global、gateway和local。
全局和网关宏变量在项目配置文件中定义,可以在任何项目模型中访问。局部宏变量在模型定义中定义,并且只能在该模型中访问。
可以在任何或所有全局、网关和本地级别指定具有相同名称的宏变量。当在多个级别上指定变量时,最特定级别的值优先。例如,局部变量的值优先于同名网关变量的值,网关变量的值优先于全局变量的值。
全局变量
全局变量在项目配置文件变量键中定义。
全局变量值可以是以下任何数据类型或包含这些类型的列表或字典:int, float, bool, str。
在模型定义中使用 @<VAR_NAME> 宏或 @VAR() 函数来访问全局变量值。后者函数要求将变量名称以单引号括起作为第一个参数,并将可选的默认值作为第二个参数。默认值是一种安全机制,用于在项目配置文件中未找到变量名称的情况下使用。
例如,以下这个 SQLMesh 配置键定义了六个不同数据类型的变量:
variables:int_var: 1float_var: 2.0bool_var: truestr_var: "cat"list_var: [1, 2, 3]dict_var:key1: 1key2: 2
python版本:
variables = {"int_var": 1,"float_var": 2.0,"bool_var": True,"str_var": "cat","list_var": [1, 2, 3],"dict_var": {"key1": 1, "key2": 2},
}config = Config(variables=variables,... # other Config arguments
)
模型定义可以像这样在WHERE子句中访问int_var值:
SELECT *
FROM table
WHERE int_variable = @INT_VAR
或者,可以通过将变量名传递给@VAR()宏函数来访问相同的变量。注意,在调用@VAR(‘int_var’)时,变量名是用单引号括起来的:
SELECT *
FROM table
WHERE int_variable = @VAR('int_var')
默认值可以作为第二个参数传递给@VAR()宏函数,如果配置文件中缺少该变量,该参数将用作回退值。
在这个例子中,WHERE子句将呈现为WHERE some_value = 0,因为在项目配置文件中没有定义名为missing_var的变量:
SELECT *
FROM table
WHERE some_value = @VAR('missing_var', 0)
对于 Python 宏函数,可通过 evalutor.var
方法获取类似的 API,对于 Python 模型,则可通过 context.var
方法获取类似的 API。
网关变量
与全局变量一样,网关变量在项目配置文件中定义。但是,它们是在特定网关的变量键中指定的:
gateways:my_gateway:variables:int_var: 1...
python代码:
gateway_variables = {"int_var": 1
}config = Config(gateways={"my_gateway": GatewayConfig(variables=gateway_variables... # other GatewayConfig arguments),}
)
在模型中使用与全局变量相同的访问方法来访问它们。
特定于网关的变量值优先于在根变量键中指定的具有相同名称的变量值。
局部变量
局部宏变量是在模型中定义的。局部变量的值优先于具有相同名称的全局变量或网关特定变量。
使用 @DEF 宏运算符定义您自己的局部宏变量。例如,你可以将宏变量 macro_var 设置为值 1 的方式如下:
@DEF(macro_var, 1);
SQLMesh 对使用 @DEF 运算符有着三项基本要求:
- MODEL 语句必须以分号结尾;
- 所有 @DEF 使用项都必须置于 MODEL 语句之后、 SQL 查询语句之前。
- 每个 @DEF 使用都必须以分号结尾;
例如,请参考 SQLMesh 快速入门指南中的以下模型 sqlmesh_example.full_model:
MODEL (name sqlmesh_example.full_model,kind FULL,cron '@daily',audits (assert_positive_order_ids),
);SELECTitem_id,count(distinct id) AS num_orders,
FROMsqlmesh_example.incremental_model
GROUP BY item_id
这个模型可以用一个用户定义的宏变量来扩展,以根据item_size过滤查询结果,如下所示:
MODEL (name sqlmesh_example.full_model,kind FULL,cron '@daily',audits (assert_positive_order_ids),
); -- NOTE: semi-colon at end of MODEL statement@DEF(size, 1); -- NOTE: semi-colon at end of @DEF operatorSELECTitem_id,count(distinct id) AS num_orders,
FROMsqlmesh_example.incremental_model
WHEREitem_size > @size -- Reference to macro variable `@size` defined above with `@DEF()`
GROUP BY item_id
本例使用@DEF(size, 1)定义宏变量size。当模型运行时,SQLMesh将在where子句中出现@size的地方替换数字1。
宏函数
除了内联用户定义变量外,SQLMesh还支持内联宏函数。与单独使用变量相比,可以使用这些函数来表达更具可读性和可重用性的逻辑。让我们来看一个例子:
MODEL(...);@DEF(rank_to_int,x -> case when left(x, 1) = 'A' then 1 when left(x, 1) = 'B' then 2 when left(x, 1) = 'C' then 3 end
);SELECTid,cust_rank_1,cust_rank_2,cust_rank_3@rank_to_int(cust_rank_1) as cust_rank_1_int,@rank_to_int(cust_rank_2) as cust_rank_2_int,@rank_to_int(cust_rank_3) as cust_rank_3_int
FROMsome.model
多个参数也可以在宏函数中表示:
@DEF(pythag, (x,y) -> sqrt(pow(x, 2) + pow(y, 2)));SELECTsideA,sideB,@pythag(sideA, sideB) AS sideC
FROMsome.triangle@DEF(nrr, (starting_mrr, expansion_mrr, churned_mrr) -> (starting_mrr + expansion_mrr - churned_mrr) / starting_mrr);SELECT@nrr(fy21_mrr, fy21_expansions, fy21_churns) AS fy21_net_retention_rate,@nrr(fy22_mrr, fy22_expansions, fy22_churns) AS fy22_net_retention_rate,@nrr(fy23_mrr, fy23_expansions, fy23_churns) AS fy23_net_retention_rate,
FROMsome.revenue
你可以像这样嵌套宏函数:
MODEL (name dummy.model,kind FULL
);@DEF(area, r -> pi() * r * r);
@DEF(container_volume, (r, h) -> @area(@r) * h);SELECT container_id, @container_volume((cont_di / 2), cont_hi) AS volume
最后总结
SQLMesh的宏与变量系统,本质上是将SQL开发从“硬编码”推向“声明式编程”的桥梁。其核心价值体现在三方面:
- 语义级宏处理:通过解析SQL结构而非单纯文本替换,确保宏操作不会破坏查询逻辑,同时支持复杂函数嵌套与Python代码注入。
- 三层变量优先级:全局配置提供基础参数,网关变量细化环境差异,局部宏则实现模型级定制,层级间遵循“就近原则”,避免配置冲突。
- 函数式宏编程:通过
@DEF
定义的宏函数支持多参数、条件分支与嵌套调用,将业务逻辑封装为SQL内的“插件”,显著提升复杂查询的复用性。
无论是处理多租户环境的动态表名替换,还是实现基于参数的查询条件分支,SQLMesh的宏系统都能以声明式语法简化开发流程。其设计哲学——“让SQL回归逻辑,让配置远离代码”,正在成为构建灵活、可扩展数据库流水线的标配工具。
相关文章:
SQLMesh 系列教程:解锁SQLMesh的宏与变量魔法
在数据库流水线开发中,代码复用与动态配置是提升效率的核心诉求。SQLMesh以其独特的宏系统与用户定义变量机制,重新定义了SQL生成的灵活性。与传统模板引擎不同,SQLMesh的宏并非简单的字符串替换,而是基于语义理解的智能代码重构—…...
React篇之three渲染
需求:拖拽右侧面板,里面的three模型能够自适应 import { useEffect, useState, useRef } from react import ./App.css import * as THREE from three; import { GLTFLoader } from three/addons/loaders/GLTFLoader.js; import { debounce } from loda…...
PHP与前端框架的无缝集成:最佳实践与案例分析
PHP与前端框架的无缝集成:最佳实践与案例分析 在现代Web开发中,PHP作为后端语言与前端框架的集成已成为一种常见的开发模式。无论是传统的MVC架构,还是现代的SPA(单页应用),PHP与前端框架的无缝集成能够显…...
Redis内存淘汰策略
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列等场景。由于 Redis 数据存储在内存中,而内存资源有限,因此需要内存淘汰策略来管理内存的使用。Redis 提供了多种内存淘汰策略,可以根据不同的应用场景选择合适的策略。 …...
Facebook 的框架及技术栈
一、前端框架与技术 React.js 及其生态系统 核心原理与特点 React.js 是 Facebook 开源的用于构建用户界面的 JavaScript 库。它的核心概念是组件化,将用户界面拆分成一个个独立的、可复用的组件。每个组件都有自己的状态(state)和属性&#…...
QT中的布局管理
在 Qt 中,布局管理器(如 QHBoxLayout 和 QVBoxLayout)的构造函数可以接受一个 QWidget* 参数,用于指定该布局的父控件。如果指定了父控件,布局会自动将其管理的控件添加到父控件中。 在你的代码中,QHBoxLa…...
如何学习VBA_3.2.20:DTP与Datepicker实现日期的输入
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的劳动效率,而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册,现在已经全部完成,希望大家利用、学习。 如果…...
在 LaTeX 中强制表格位于页面顶部
在 LaTeX 中强制表格位于页面顶部,可以通过以下 多种方法结合使用,按优先级推荐: 方法 1:使用 [!t] 位置限定符 原理:通过 [!t] 强制 LaTeX 优先将表格放置在页面顶部(Top),! 表示忽…...
dify+mysql的诗词助手
目录 数据库表结构: 数据库查询的http服务搭建: 流程引擎搭建: 开始, HTTP查询数据库, LLM数据分析, 直接回复, 效果测试: 下载链接: 数据库表结构:…...
PyTorch 入门学习
目录 PyTorch 定义 核心作用 应用场景 Pytorch 基本语法 1. 张量的创建 2. 张量的类型转换 3. 张量数值计算 4. 张量运算函数 5. 张量索引操作 6. 张量形状操作 7. 张量拼接操作 8. 自动微分模块 9. 案例-线性回归案例 PyTorch 定义 PyTorch 是一个基于 Python 深…...
【视频】SRS将RTMP转WebRTC、HLS流;获取RTSP转其它流
1、安装依赖库 sudo apt install tclsh sudo apt install cmake sudo apt install autotools-dev automake m4 perl sudo apt install libtool2、源码安装 1)下载源码 https://github.com/ossrs/srs/releases/tag/v5.0-r32)配置、编译 ./configure && make -j83、…...
linux中如何查询文件夹大小
在 Linux 中,可以使用 du 命令查看文件夹大小。以下是常用方法: 标题1. 查看文件夹大小 du -sh /path/to/directory-s:显示总大小。 -h:以易读格式(如 KB、MB、GB)显示大小。 标题2:查看文件…...
MySQL增删改查操作 -- CRUD
个人主页:顾漂亮 目录 1.CRUD简介 2.Create新增 使用示例: 注意点: 3.Retrieve检索 使用示例: 注意点: 4.where条件查询 前置知识:-- 运算符 比较运算符 使用示例: 注意点…...
uniapp+Vue3 组件之间的传值方法
一、父子传值(props / $emit 、ref / $refs) 1、props / $emit 父组件通过 props 向子组件传递数据,子组件通过 $emit 触发事件向父组件传递数据。 父组件: // 父组件中<template><view class"container">…...
TDengine SQL 函数
单行函数 数学函数 ABSACOSASINATANCEILCOSDEGREESEXPFLOORGREATESTLEASTLNLOGMODPIPOWRADIANSRANDROUNDSIGNSINSQRTTANTRUNCATE 字符串函数 ASCIICHARCHAR_LENGTHCONCATCONCAT_WSLENGTHLOWERLTRIMPOSITIONREPEATREPLACERTRIMSUBSTRING/SUBSTRSUBSTRING_INDEXTRIMUPPER 转换函数…...
智能三防手持终端破解传统仓储效率困局
在数字化浪潮的推动下,传统仓储管理模式正面临效率低、成本高、错误频发等瓶颈。如何实现精准、高效、智能化的仓储管理,上海岳冉三防智能手持终端机以RFID技术为核心,结合工业级三防(防水、防摔、防尘)设计࿰…...
力扣——K个一组翻转链表
题目链接: 链接 题目描述: 思路: 可以理解为把原链表的每一段进行反转 把链表的每一段看成新链表,单独进行反转,然后再放回原链表 关键是截取k个节点、进行反转后,怎么再和原链表链接起来 我们把截取的…...
5-27 临摹大师-IP-Adapter
前言: 前一节我们主要介绍ControlNet中如何对黑白照片进行上色 主要介绍ControlNet中的IP-Adapter。这个也是一种类似的风格借鉴,类似Reference的能力。 当然IP-Adapter有两点或许可以吸引我们,一个是国人腾讯公司制作的。另一个在速度和效…...
MinIO的预签名直传机制
我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…...
树莓科技集团董事长:第五代产业园运营模式的深度剖析与展望
第五代产业园运营模式,以创新为核心驱动,强调数字化、网络化和资源整合。树莓科技集团在这一领域具有代表性,其运营模式值得深入剖析。 核心特征 数字化转型:第五代产业园高度重视数字化技术的应用,通过构建数字化平…...
项目组织管理类型-职能式组织和矩阵式组织的区别
在职能式组织和矩阵式组织中,任务分配和人员安排确实有显著的不同,让我们通过以下例子来进一步解释: 职能式组织在职能式组织中,任务通常是根据部门的职能进行下达的。 例如,一家制造公司的组织结构如下: …...
树莓科技(成都)集团:如何铸就第五代产业园标杆
树莓科技(成都)集团铸就第五代产业园标杆,主要体现在以下几个方面: 精准定位与前瞻布局 树莓科技并非盲目扩张,而是精准锚定数字经济发展方向。以成都为起点,迅速构建起全国性的园区版图,体现…...
【Quest开发】手柄交互震动
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72(要提前导入哦) 硬件:Meta Quest3 参考Meta开发文档:https://developers.meta.com/horizon/documentation/unity/unity-haptics-sdk-integrate 这篇官…...
《Transformer如何进行图像分类:从新手到入门》
引言 如果你对人工智能(AI)或深度学习(Deep Learning)感兴趣,可能听说过“Transformer”这个词。它最初在自然语言处理(NLP)领域大放异彩,比如在翻译、聊天机器人和文本生成中表现出…...
数字图像处理与Python语言实现-Box模糊CUDA实现
Box模糊CUDA实现 文章目录 Box模糊CUDA实现1、Box模糊的基本原理2、算法优化:滑动窗口技术3、参数对模糊效果的影响4、Box模糊的优缺点5、与高斯模糊的对比6、实际应用场景7、算法实现7.1 PyCUDA实现7.2 CuPy实现7.3 C++与CUDA实现8、总结在图像处理领域,**Box模糊(方框模糊…...
MAVEN解决版本依赖冲突
文章目录 一、依赖冲突概念1、什么是依赖冲突2、依赖冲突的原因3、如何解决依赖冲突 二、查看依赖冲突-maven-helper1、安装2、helper使用1、conflicts的阅读顺序(从下向上看)2、dependencies as List的阅读顺序(从下向上看)3、de…...
Compose 实践与探索五 —— AnimationSpec
不论是 animateXxxAsState() 还是 Animatable 的 animateTo() 都可以传入 AnimationSpec 以配置动画的规格: Composable fun animateDpAsState(targetValue: Dp,animationSpec: AnimationSpec<Dp> dpDefaultSpring,label: String "DpAnimation",…...
Embedding模型到底是什么?
嵌入模型(Embedding Model)是一种将高维数据映射到低维空间的工具,广泛应用于自然语言处理(NLP)、推荐系统和图像识别等领域。它的核心目标是将复杂的数据(如文本、图像或用户行为)转换为稠密的…...
数据结构(一)——绪论
一、数据结构的研究内容 1.数据的各种逻辑结构和物理结构,以及他们之间的相应关系 2.存储结构的方法,对每种结构定义相适应的各种运算 3.设计出相应的算法 4.分析算法的效率 二、数据结构的基本概念 1.数据(data):…...
VMware虚拟机网络连接模式介绍以及nat模式访问公网实践
在 VMware 虚拟机中,网络配置是非常重要的一部分。VMware 提供了三种主要的网络连接模式,分别是桥接模式(Bridged)、NAT模式(NAT) 和仅主机模式(Host-Only)。每种模式都有其特定的用…...
Selenium Manager和webdriver manager的区别与联系
一、引言 1.1 自动化测试的重要性 在现代软件开发流程中,自动化测试已经成为保证软件质量和提高交付效率的关键实践。随着软件开发周期的缩短和软件复杂性的增加,手工测试已无法满足快速迭代的需求。自动化测试能够快速、准确地执行重复性测试任务&…...
八叉树地图的原理与实现
八叉树与体素图 八叉树地图 八叉树地图是可变分辨率的三维栅格地图,可以自由调整分辨率,如下所示: 根据点云的数量或密度决定每个叶子方块是否被占据 体素图 体素就是固定分辨率的三维栅格地图,如下所示: 根据点云…...
DeepSeek模型本地化部署方案及Python实现
DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI…...
【Linux】浅谈冯诺依曼和进程
一、冯诺依曼体系结构 冯诺依曼由 输入设备、输出设备、运算器、控制器、存储器 五部分组成。 冯诺依曼的设计特点 二进制表示 所有数据(包括程序指令)均以二进制形式存储和运算,简化了硬件逻辑设计,提高了可靠性。 存储程序原理…...
基于深度学习的多模态人脸情绪识别研究与实现(视频+图像+语音)
这是一个结合图像和音频的情绪识别系统,从架构、数据准备、模型实现、训练等。包括数据收集、预处理、模型训练、融合方法、部署优化等全流程。确定完整系统的组成部分:数据收集与处理、模型设计与训练、多模态融合、系统集成、部署优化、用户界面等。详…...
【蓝桥杯】第15届c++B组--R格式
问题描述 小蓝最近在研究一种浮点数的表示方法:RR 格式。对于一个大于 0 的浮点数 dd,可以用 RR 格式的整数来表示。给定一个转换参数 nn,将浮点数转换为 RR 格式整数的做法是: 将浮点数乘以 2n2n; 四舍五入到最接近的整数。 …...
【初阶三】认识C语言—下
【初阶三】认识C语言—下 1.函数2.数组3.操作符3.1算数操作符3.2移位操作符和位操作符3.3赋值操作符3.4单目操作符 4.常见关键字4.1关键字typedef4.2 关键字static 5. define定义常宏6.指针6.1内存6.2取地址操作符& 7.结构体 1.函数 函数就像一个工厂,通过输入原…...
【C#】使用DeepSeek帮助评估数据库性能问题,C# 使用定时任务,每隔一分钟移除一次表,再重新创建表,和往新创建的表追加5万多条记录
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...
前端学习笔记(三)——ant-design vue表单传递数据到父页面
前言 善用AI,快速解决定位 原理 a-form所在的SFC(单文件)vue中需要将表单数据传递给父页面SFC文件中,使用emit方法 代码 子组件(Form.vue) <template><a-form submit"handleSubmit&qu…...
计算机视觉算法实战——驾驶员玩手机检测(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域简介:玩手机检测的重要性与技术挑战 驾驶员玩手机检测是智能交通安全领域的核心课题。根据NHTSA数据࿰…...
C语言(23)
字符串函数 11.strstr函数 1.1函数介绍: 头文件:string.h char *strstr ( const char * str1,const char *str2); 作用:在一个字符串(str1)中寻找另外一个字符串(str2)是否出现过 如果找到…...
Python入门教程:从零开始学习Python编程
引言 Python是一种高级编程语言,因其简洁的语法和强大的功能而广受欢迎。无论你是编程新手,还是有经验的开发者,Python都是一个非常好的选择。本文将带你从零开始学习Python编程,涵盖基础语法、常用库以及一些实用的编程技巧。 目…...
SAIL-RK3576核心板应用方案——无人机视觉定位与地面无人设备通信控制方案
本方案以 EFISH-RK3576-SBC工控板 或 SAIL-RK3576核心板 为核心,结合高精度视觉定位、实时通信与智能控制技术,实现无人机与地面无人设备的协同作业。方案适用于物流巡检、农业植保、应急救援等场景,具备高精度定位、低延迟通信与强环境适应性…...
14.C语言const的使用规范,详细说明
目录 修饰变量 修饰指针 指向常量的指针 常量指针 指向常量的常量指针 修饰函数参数 修饰函数返回值 总结 在 C 语言里,const 是一个类型限定符,它的作用是将变量定义为只读,也就是不允许对其值进行修改,用来修饰函数中的…...
安装操作系统ubuntu-20.04.6-live-server-amd64
一、下载虚拟机软件、远程控制软件及操作系统镜像 下载VMware Workstation: 下载 VMware Workstation Pro 个人免费版(可能会访问不了,那就随便找个能下载的版本安装)下载XShell: XShell 家庭/学校免费版下载ubuntu操作系统 ubuntu-20.04.6-…...
使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b或DeepSeek-r1:1.5b 模型(完成度80%)
原文:🚣♂️ 使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b 模型 🚣 — PaddleNLP 文档 使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b 模型 🚣 PaddleNLP 在支持 AVX 指令的 CPU 上对 llama 系列模型进行了…...
【Golang】第五弹----函数
笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:Golang 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 一、函数 1.1基本介绍…...
适合二次开发的Web组态软件推荐
在选择适合二次开发的Web组态软件时,需要考虑多个因素,包括开源与否、功能、社区支持、文档完整性等。以下是一些适合二次开发的Web组态软件: 1. Node-RED 简介: Node-RED 是一个基于流的编程工具,最初由IBM开发,现为…...
三、Docker 集群管理与应用
(一)项目案例 1、准备主机 (1)关闭防火墙,或者开放TCP端口2377(用于集群管理通信)、TCP/UPD端口7946(用于节点之间的通信)、UDP端口4789(用于overlay网络流…...
Spring 注解解析
一、Import 1、核心作用 Import 是 Spring 模块化配置的核心注解,用于将外部配置类、组件或动态逻辑导入当前 Spring 上下文。其核心功能包括: 配置类聚合:整合多个分散的 Configuration 类,解决大型项目中配置分散的问题。动态…...