当前位置: 首页 > news >正文

SQLMesh系列教程-2:SQLMesh入门项目实战

假设你已经了解SQLMesh是什么,以及其他应用场景。如果没有,我建议你先阅读《SQLMesh系列教程-1:数据工程师的高效利器-SQLMesh》。

在本文中,我们将完成一个小项目或教程,以帮助你开始使用SQLMesh。你可以选择一步一步地进行操作,也可以通读一遍以了解整个过程。

在这里插入图片描述

搭建开发环境

你可以使用自己喜欢的IDE,但在本教程中我将使用VSCode。我们将使用duckdb作为执行引擎和数据源。如果你对duckdb在CLI和Python开始使用感兴趣,请搜索我的其他duckdb系列文章。

首先,让我们通过安装Python和必要的依赖项来设置工作环境。创建一个Python虚拟环境并安装依赖项:

python -m venv .venv
source ./venv/bin/activate
pip install 'sqlmesh[duckdb]'

我们将使用一个简单的数据集来重点理解SQLMesh。让我们在duckdb CLI中创建一个源数据库(也可以在Python中执行相同的操作)。我将使用名称“db.db”,因为它是初始化duckdb项目时SQLMesh配置的默认名称:

duckdb db.db

创建schema及源表:

CREATE SCHEMA example;
CREATE OR REPLACE TABLE example.letters (id INTEGER, letter CHAR(1), value INTEGER, updated_date DATE); -- 插入数据
INSERT INTO example.letters VALUES (1, 'A', 10, '2025-01-07'), (2, 'B', 20, '2025-01-07'), (3, 'C', 30, '2025-01-07');

检查表数据:

SELECT * FROM example.letters;┌───────┬─────────┬───────┬──────────────┐
│  id   │ letter  │ value │ updated_date │
│ int32 │ varchar │ int32 │     date     │
├───────┼─────────┼───────┼──────────────┤
│     1 │ A       │    102025-01-07   │
│     2 │ B       │    202025-01-07   │
│     3 │ C       │    302025-01-07   │
└───────┴─────────┴───────┴──────────────┘

初始化SQLMesh项目

在命令行中,执行以下命令初始化sqlmesh项目:

sqlmesh init duckdb

一旦你运行这个命令,你会看到生成了几个文件夹,就像你初始化dbt项目时一样:

在这里插入图片描述

解释sqlmesh项目结构

在上面的截图中,您可以看到多个文件夹,例如:

  • “audits” - 用于定义自定义数据审计的SQL文件
  • “logs” - (运行项目后你会看到)-日志文件
  • “macros” - Python文件用于Python宏,SQL文件用于Jinja宏
  • “models” - SQL或Python文件/模型将被存储
  • “seeds” - 静态CSV文件
  • “tests” - 定义单元测试的yaml文件

你还可以看到“config.yaml”。配置SQLMesh项目设置的文件。让我们看下配置文件内容:

gateways:local:connection:type: duckdbdatabase: db.dbdefault_gateway: localmodel_defaults:dialect: duckdbstart: 2025-02-09

这是配置数据库连接的地方。SQLMesh用duckdb作为后端初始化项目的上述内容。

基本上就是说,SQLMesh在默认情况下使用名为“local”的网关,在使用duckdb SQL方言的名为“db.db”的数据库中使用duckdb作为其执行引擎。正如你可能已经猜到的,你可以在这个配置文件中分离测试连接和状态数据库连接。

现在,让我们稍微修改一下这个配置文件,添加一个单独的test/state连接:

gateways:local:connection:type: duckdbdatabase: db.dbtest_connection:type: duckdbdatabase: test.dbstate_connection:type: duckdbdatabase: state.dbdefault_gateway: localmodel_defaults:dialect: duckdbstart: 2025-02-09

我指定使用“test.db”运行测试,使用“state.db”管理状态信息。现在我们有了一个整体的结构,让我们来为一个演示目构建模型、宏、审计和测试。

从头设计数据模型

我们将构建模型、Python宏、审计和测试。在初始化的SQLMesh项目中,有3个模型:

  • seed_model.sql
  • incremental_model.sql
  • full_model.sql

种子模型是静态的,为了使我们的项目更有意义,我们将使用我们在前一步中生成的一些数据完全替换种子模型。我们还将用新产品替换其他两种型号。

之后,我们将执行模型并创建一个简单的Python宏、一个自定义审计和一个单元测试。我们将看到所有这些如何很好地协同工作。

让我们删除“seed_model”。Sql”文件。您可以手动执行或运行命令:

rm models/*.sql

让我们创建一个新模型,它将作为其他两个模型的基础。我们已经在“db.db”中创建了一个源表,它被设置为SQLMesh项目的连接数据库。

建立基础模型

我将这个模型命名为“base_model.sql”:

MODEL (name example.base_model,owner tom,kind VIEW,cron '@daily',grain id,column_descriptions (id = 'primary key',letter = 'alphabet letter',value = 'random value'));SELECTid::INT,letter::TEXT,value::INT,updated_date
FROM 
db.example.letters  -- full table path

需要注意的一些事情:

  • 模型元数据直接进入模型文件,而不是像在dbt中那样在单独的yaml文件中定义所有内容。
  • 你可能不熟悉元数据,如“kind”,“owner”,“cron”和“grain”,但它们是相当不言自明的。虽然‘ cron ’将在运行‘ sqlmesh run ’时使用,我们将在后面介绍。你可以在SQLMesh的文档页面上查看可用的模型属性。
  • 类型转换是使用Postgres的‘ x::int ’语法完成的。您还可以在‘ MODEL ’块中指定模式(列名=数据类型)。
  • 你可以通过添加类似“id::INT -主键”这样的注释来添加列描述,但我喜欢将列描述放在“MODEL”块中。
  • 如果您引用的是SQLMesh项目之外的表,它将被视为外部表,你需要指定表路径,而不是模型名称。

外部模型

可选地,你可以创建/生成一个external_models。用于存储外部表的元数据。定义外部模型的元数据的好处是,SQLMesh可以使特性更有用。例如,如果你没有创建yaml文件,那么你将无法获得到外部模型的列级沿袭。

创建external_models。您可以手动定义Yaml,也可以运行以下命令:

sqlmesh create_external_models 

SQLMesh将创建一个yaml文件,如下所示:

- name: '"db"."example"."letters"'columns:id: INTletter: TEXTvalue: INTupdated_date: DATEgateway: local

建立下游模型

既然基本模型已经准备好了,其外部模型模式信息也已经到位,那么让我们创建更多的模型。

  • “example.intermediate_model.sql” - 这个模型类似于“base_model.sql”,除了它包括一个新的列,改变了它只需要指定上游表的模型名,并使用‘ FULL ’物化策略:
MODEL (name example.intermediate_model,owner tommy,kind FULL,cron '@daily',grain id,column_descriptions (id = 'primary key',letter = 'alphabet letter',value = 'random value',updated_date = 'updated date',new_col = 'a new column'));SELECTid,letter,value,@multiply_by_10(value) AS big_value,updated_date,'new_col' AS new_colFROMexample.base_model

“example.incremental_model。- 该模型使用‘ INCREMENTAL_BY_TIME_RANGE ’物化策略,这是SQLMesh中3个增量加载选项之一。这需要添加where子句,以确保只处理必要的数据。

MODEL (name example.incremental_model,owner tommy,kind INCREMENTAL_BY_TIME_RANGE (time_column (updated_date, '%Y-%m-%d'),lookback 5,  -- to handle late arriving date),start '2025-01-01',cron '@daily',grain id,column_descriptions (id = 'primary key',letter = 'alphabet letter',updated_date = 'updated date',));SELECTid,letter,updated_dateFROMexample.base_modelWHERE updated_date BETWEEN @start_date AND @end_date

我不会太深入SQLMesh的增量加载选项,但简单地说,你可以使用增量加载数据:

  • by time range
  • by partition
  • by unique key (a merge operation)

使用“sqlmesh plan”应用更改

现在已经构建了我们的模型,我们将使用‘ sqlmesh plan ’命令查看更改并加载数据。

注意:`test_full_model。我们初始化项目时附带的Yaml '文件应该删除,因为它不再适用于我们的项目。如果尝试在不删除yaml文件的情况下运行下面的命令,可能会遇到错误。因此,请确保在继续之前将其从项目中删除。

首先运行下面命令:

sqlmesh plan dev

系统将询问您希望回填多少数据的日期范围,但通过按回车键将其保留为空白。对于最后一个问题,输入“y”以应用更改:

在这里插入图片描述

执行过程截图:

在这里插入图片描述

为了确保你的模型被物化,你可以进入你的数据库或使用‘ sqlmesh fetchdf ’命令:

$ sqlmesh fetchdf "select * from example__dev.base_model;"id letter  value updated_date
0   1      A     10   2025-01-07
1   2      B     20   2025-01-07
2   3      C     30   2025-01-07

注意,我必须将模式指定为example__dev。模式的格式是YOURSCHEMA__{yourenenvironment}。在这种情况下,我运行sqlmesh plan dev ,并添加了__dev后缀。

如果一切正常,那么你可以通过运行以下命令将更改部署到生产环境:

sqlmesh plan

在这里插入图片描述
检查生产环境中的base_model表(schema没有后缀):

$ sqlmesh fetchdf "select * from example.base_model;"id letter  value updated_date
0   1      A     10   2025-01-07
1   2      B     20   2025-01-07
2   3      C     30   2025-01-07

你可能已经注意到,当我们运行‘ sqlmesh plan ’时,我们不需要回填任何数据。SQLMesh只是通过使用视图将指针切换到更新后的表。

现在,在实际项目中,顺序运行‘ sqlmesh plan dev ’和‘ sqlmesh plan ’可能不是你部署到生产环境的方式。好消息是SQLMesh有一个开源的GitHub Actions CI/CD Bot。它的功能如下:

自动在pr上运行单元测试

  • 自动创建PR环境,表示PR中的代码更改
  • 自动分类和回填数据的模型已经改变
  • 自动将更改部署到生产中,自动防止数据差距并合并PR

这些要点是从SQLMesh网站上复制粘贴过来的,在未来文章中我们继续讨论。

sqlmesh run

当我第一次开始使用SQLMesh时,我有一个问题:sqlmesh plansqlmesh run 之间的区别是什么?

  • ‘ sqlmesh plan ’汇总本地所有变更,并允许你在目标环境中检查和执行模型。
  • ‘ sqlmesh run ’根据每个cron时间表执行模型。对我来说,除了SQLMesh利用模型属性中定义的“cron”之外,更容易认为它是“dbt run”。例如,假设你有一个具有每日cron计划的模型和另一个具有小时cron计划的模型。你计划通过GitHub Actions每小时运行“sqlmesh run”命令。使用每日cron计划的模型每天只运行一次,而如果您每小时运行“dbt run”,则所有模型每小时运行一次,从而导致浪费计算资源。

现在我们已经介绍了两个关键的SQLMesh命令,让我们继续学习我们的教程/项目。

总结

本文我们首先搭建duckdb及sqlmesh基础开发环境,然后新建入门项目,解释项目结构,构建数据模型,执行模型并查看结果。为了避免文章篇幅太长,关于宏、审计、测试,数据血缘关系及DAG, python模型。

相关文章:

SQLMesh系列教程-2:SQLMesh入门项目实战

假设你已经了解SQLMesh是什么,以及其他应用场景。如果没有,我建议你先阅读《SQLMesh系列教程-1:数据工程师的高效利器-SQLMesh》。 在本文中,我们将完成一个小项目或教程,以帮助你开始使用SQLMesh。你可以选择一步一步…...

window 安装GitLab服务器笔记

视频: windows下内网本地部署gitlab 资源: Linux CeneOS7: CentOS7 镜像下载地址 VMware: 虚拟机17.6下载地址 安装vim编辑器 yum install vim -y系统环境升级(我第一次没有使用。第二次成功使用了的)…...

【逆向工程】破解unity的安卓apk包

先了解一下普通apk包的逆向方法(无加密或加壳) 开发环境: 操作系统:windows 解apk包 下载工具:apktool【Install Guide | Apktool】按照文档说的操作就行,先安装java运行时环境【我安装的是jre-8u441-wind…...

2021版小程序开发5——小程序项目开发实践(2)-完

2021版小程序开发5——小程序项目开发实践(2) 学习笔记 2025 使用uni-app开发一个电商项目继续&#xff1b; 过滤器的使用 filters: {toFixed(num){return Number(num).toFixed(2)} }<!-- 通过管道符 | 使用过滤器 --> <view> {{ item.price | toFixed }}</vi…...

Spring Boot牵手Redisson:分布式锁实战秘籍

一、引言 在当今的分布式系统架构中,随着业务规模的不断扩大和系统复杂度的日益增加,如何确保多个服务节点之间的数据一致性和操作的原子性成为了一个至关重要的问题。在单机环境下,我们可以轻松地使用线程锁或进程锁来控制对共享资源的访问,但在分布式系统中,由于各个服务…...

【HarmonyOS Next 自定义可拖拽image】

效果图&#xff1a; 代码&#xff1a; import display from "ohos.display" import { AppUtil } from "pura/harmony-utils"/*** 自定义可拖拽图标组件*/ Component export default struct DraggableImage {imageResource?: ResourceimageHeight: numbe…...

基于扑克牌分发效果制作时的问题总结

其基本效果如图 1. 在overlay模式下直接使用position来移动 实现代码 public class Card : MonoBehaviour {public RectTransform target;public Button cardButton;private bool isPack false;public List<RectTransform> cards new List<RectTransform>(…...

为多个GitHub账户配置SSH密钥

背景 当需要同时使用多个GitHub账户&#xff08;例如工作和个人账户&#xff09;时&#xff0c;默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对&#xff0c;并指…...

三步本地部署deepseekr1,支持macOs,ubuntu,Windows

一、ollama安装: ollama官网:Ollama Ollama 是一款支持在 Windows、macOS 和 Linux 上本地运行大型语言模型的工具。以下是针对不同操作系统的安装指南: 1、Windows 系统 下载安装包:访问 Ollama 官方下载页面,选择适用于 Windows 的安装包进行下载。 运行安装程序:下…...

STM32 HAL库 CANbus通讯(C语言)

#include "main.h" #include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox;void CAN_Init(void) {// 使能CAN时钟__HAL_RCC_CAN1_C…...

Cotex-M系列介绍

一、芯片设计公司——ARM ARM公司&#xff1a;只做内核设计和IP授权&#xff0c;不参与芯片设计 二、Cortex内核分类及特征...

测试自动化落地方向

一、视觉回归自动化测试&#xff08;低成本高回报&#xff09; 痛点&#xff1a; UI 频繁迭代导致视觉问题难覆盖 方案&#xff1a; 引入Applitools或SikuliX做视觉比对&#xff08;无需维护元素定位&#xff09; 关键路径截图比对&#xff0c;自动检测 UI 错位/样式问题 亮点…...

如何通过优化网站结构提高SEO效果?

很多人以为&#xff0c;SEO就是写写关键词&#xff0c;发点外链&#xff0c;但其实&#xff0c;网站结构才是排名的地基&#xff01;你可以把网站想象成一栋房子&#xff0c;框架没搭好&#xff0c;装饰再漂亮也没用&#xff0c;迟早会塌。同样的道理&#xff0c;如果网站结构混…...

迅雷下载的原理和使用协议的分析

迅雷作为一款广泛使用的下载工具&#xff0c;其核心原理是通过整合多种下载协议和资源分发技术来提升下载速度。以下是对其原理及协议的详细分析&#xff1a; 一、迅雷下载的核心原理 多协议混合下载&#xff08;P2SP&#xff09; P2SP&#xff08;Peer-to-Server-Peer&#xf…...

RPA与深度学习结合

什么是RPA RPA即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#xff0c;它是一种利用软件机器人模拟人类在计算机上的操作&#xff0c;按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...

Linux内核模块参数与性能优化:__read_mostly属性的深度剖析

在Linux内核开发中,模块参数和性能优化是两个至关重要的主题。模块参数允许开发者和用户在加载内核模块时动态配置模块的行为,而性能优化则是确保内核高效运行的关键。本文将深入探讨Linux内核中的模块参数机制以及__read_mostly属性的使用,通过实际代码示例和详细解释,帮助…...

Elasticsearch:如何使用 Elastic 检测恶意浏览器扩展

作者&#xff1a;来着 Elastic Aaron Jewitt 当你的 CISO 询问你的任何工作站上是否安装过特定的浏览器扩展时&#xff0c;你多快能得到正确答案&#xff1f;恶意浏览器扩展是一个重大威胁&#xff0c;许多组织无法管理或检测。这篇博文探讨了 Elastic Infosec 团队如何使用 os…...

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…...

SAP-ABAP:FOR ALL ENTRIES IN用法详解带实例代码

在 SAP ABAP 中&#xff0c;FOR ALL ENTRIES IN 是 SELECT 语句中一个非常常用的功能&#xff0c;用于根据内表中的数据查询数据库表。它的主要作用是将内表中的数据作为查询条件&#xff0c;从数据库表中筛选出符合条件的数据。 1. 基本语法 SELECT <fields>FROM <d…...

构建jdk17包含maven的基础镜像

1、先拉取jdk17基础镜像 docker pull openjdk:17-jdk-alpine 2、使用jdk17基础镜像创建容器 docker run -it openjdk:17-jdk-alpine sh 或 docker run -it --name jdk17 openjdk:17-jdk-alpine sh 3、修改镜像源地址 cat /etc/apk/repositories https://mirrors.aliyun.com…...

【Android】版本和API对应关系表

目录 版本和API对应关系表 不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。要沉下心来&#xff0c;诗和远方的路费真的很贵&#xff01; 版本和API对应关系表 版本名版本号名称APIAndroid 1616.0W36Android 1515.0V35Android 1414.0U34Android 1…...

Spring Boot 整合 JPA 实现数据持久化

目录 前言 一、JPA 核心概念与实体映射 1. 什么是 JPA&#xff1f; 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口&#xff1f; 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...

KUKA 机器人仿真——Simpro4.1和OfficeLite8.6.2 连接实现虚拟示教器

一、准备软件 1、Simpro4.1&#xff0c;是一机一密钥&#xff0c;不好破解&#xff0c;我在某宝买的&#xff0c;省事了。 2、OfficeLite8.6.2&#xff0c;看我的博文的第三步虚拟机内安装OfficeLite8.6.2 KUKA示教器仿真软件OfficeLite8.6.2&#xff0c;EthernetKRL3.1.3通信…...

IntelliJ IDEA使用经验(十三):使用Git克隆github的开源项目

文章目录 问题背景办法1、设置git代理&#xff1b;2、再次克隆项目&#xff1b;3、再次按常规方式进行git克隆即可。 问题背景 由于github在国外&#xff0c;很多时候我们在使用idea克隆开源项目的时候&#xff0c;没办法检出&#xff0c;提示 连接重置。 办法 1、设置git代…...

互联网大厂中面试的高频计算机网络问题及详解

前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 先来说说计算机网…...

综合实验练习实验报告

一、需求分析 1.防火墙上配置DHCP服务&#xff0c;完成接口配置 2.用户建立以及认证策略建立 3.安全策略建立 二、详细配置 DHCP配置 [FW1]dhcp enable [FW1]int g1/0/1.1 [FW1-GigabitEthernet1/0/1.1]dhcp select interface [FW1]int g1/0/1.2 [FW1-GigabitEthernet…...

Ubuntu22.04 配置deepseek知识库

文章目录 安装 docker配置 dify配置 ollama创建大模型 安装 docker 更新系统&#xff1a;sudo apt update sudo apt upgrade -y安装必要的依赖&#xff1a;sudo apt install apt-transport-https ca-certificates curl software-properties-common -y添加 Docker 的官方 GPG 密…...

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤&#xff0c;无需本地部署模型&#xff0c;直接通过官网连接使用&#xff1a;1. 下载并安装OfficeAI插件 &#xff08;1&#xff09;访问OfficeAI插件下载地址&#xff1a;OfficeAI助手 - 免费办公智能AI助手, AI写作&#xff0c;下载…...

Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)

背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…...

jvm 线程监控调试

文章目录 前言一、使用JDK工具转储线程文件(如jstack)1. 找到Java进程的PID:2. 使用jstack生成线程转储文件:3.验证生成的线程转储文件:二、分析文件1.使用在线工具进行分析上传thread-dump文件,等待解析完成2.查看分析结果总结前言 提示:使用jdk自带工具转储线程监控文…...

超越 DeepSeek V3 -->【Qwen2.5-Max】

&#x1f525; 先说明&#xff0c;不是广子&#xff0c;不是广子&#xff01;&#xff01;&#xff01;单纯分享这个工具给大家&#xff0c;毕竟最近使用 DeepSeek 太容易崩了&#xff0c;每天深度思考一次之后就开始转圈圈用不了&#xff0c;然后就找到了这个工具使用 一、前言…...

301.华为交换机堆叠技术基础

华为交换机堆叠技术基础 一、概念及原理部分1.堆叠简介1.1 什么是堆叠1.2 可靠性网络架构1.3 华为堆叠设备1.4 其他厂商的堆叠2.堆叠的示意图3.堆叠的应用3.1 中小企业3.2 园区网4.堆叠的原理4.1基本的概念4.2 堆叠建立4.3 角色选举4.4 版本同步4.5 配置同步4.6 堆叠系统的登录…...

【开源AI】AI一页一页读PDF

【开源AI】AI一页一页读PDF 可以在这里看 : 让AI 处理 PDF 文件,提取其中的知识点,并生成总结。 只是无法修改,后续若有更新在csdn这里。 【OpenAI】 API 更新: JSON 结构化输出约束机制( JSON Schema) 的一次实战。知识库的JSON Schema形式 每一页都要总结,总结的知识…...

Spring AI 介绍

文章来源&#xff1a;AI 概念 (AI Concepts) _ Spring AI1.0.0-SNAPSHOT中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它&#xff0c;以了解 Spring AI 是如何实现的。 模型 AI 模型是旨在处理和生成…...

React - 事件绑定this

在 React 中&#xff0c;this 的绑定是一个常见问题&#xff0c;尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数&#xff0c;当被调用时&#xff0c;其 this 关键字被设置为提供的…...

【3.Git与Github的历史和区别】

目录 Git的历史和Github的区别本质和功能 Git的历史和Github的区别 Git是由Linux内核的创造者Linus Torvalds于2005年创建的。当时&#xff0c;Linux内核开源项目使用BitKeeper作为版本控制系统&#xff0c;但2005年BitKeeper的商业公司终止了与Linux社区的合作&#xff0c;收…...

【设计模式】【行为型模式】职责链模式(Chain of Responsibility)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f4eb; 欢迎V&#xff1a; flzjcsg2&#xff0c;我们共同讨论Java深渊的奥秘 &#x1f…...

【算法学习】二分查找开区间写法总结

根据灵神教学中的二分查找开区间写法进行如下总结&#xff1a; 我们需要注意的是&#xff0c;lowerBound 模板求解的是 > target 的最小下标 private int lowerBound(int[] nums, int target) {int left -1;int right nums.length; // 开区间 (left, right)while (left …...

信息科技伦理与道德3-2:智能决策

2.2 智能推荐 推荐算法介绍 推荐系统&#xff1a;猜你喜欢 https://blog.csdn.net/search_129_hr/article/details/120468187 推荐系统–矩阵分解 https://blog.csdn.net/search_129_hr/article/details/121598087 案例一&#xff1a;YouTube推荐算法向儿童推荐不适宜视频 …...

【干活分享】2025年可以免费问答的一些GPT网站-deepseek等免费gpt

2025年已经到来&#xff0c;大家也都陆续回归到忙碌的工作中。在新的一年里&#xff0c;如何更高效地完成工作任务&#xff0c;提升工作效率&#xff0c;是很多人关心的问题。今天&#xff0c;就为大家分享一些实用性很强的GPT网站&#xff0c;帮助大家在工作中事半功倍。 Dee…...

webpack配置之---入口

entry 单入口 由于一般的单页面项目只有一个入口&#xff0c;也就是单入口&#xff0c;单入口的配置方式有以下三种方式&#xff0c;如果有遗漏的欢迎补充 1、字符串方式 以下这几行代码解释&#xff1a; entry&#xff1a;本项目的入口文件 output&#xff1a;本项目打包…...

Golang GORM系列:GORM CRUM操作实战

在数据库管理中&#xff0c;CRUD操作是应用程序的主干&#xff0c;支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性&#xff0c;使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南&#xff0c;提供了在Go应用程序中有效…...

[M模拟] lc380. O(1) 时间插入、删除和获取随机元素(模拟+数据结构+脑筋急转弯+数组快捷删除技巧+项目思考)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;380. O(1) 时间插入、删除和获取随机元素 题单&#xff1a; 待补充 2. 题目解析 其实这个题目抽象一下的话在项目中也能出现&#xff0c;可能日常项目中没有算法基础的话&#xff0c;就很容易直接去进行新内…...

30~32.ppt

目录 30.导游小姚-介绍首都北京❗ 题目​ 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目​ 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题&#xff1a;考生文件夹&#xff08;注意&#x…...

一键查看电脑各硬件详细信息 轻松查看电脑硬件参数

今天为大家推荐两款非常实用的电脑硬件查看软件&#xff0c;它们能够一键快速查看电脑的各种配置信息&#xff0c;使用起来非常方便。 一键查看电脑各硬件详细信息 这款软件是绿色版的&#xff0c;无需安装&#xff0c;打开即可使用&#xff0c;文件大小仅为900多KB&#xff0…...

java如何创建自定义异常?

在Java中&#xff0c;创建自定义异常通常需要继承Exception类或其子类。以下是创建自定义异常的基本步骤&#xff1a; 定义异常类&#xff1a;创建一个新的类&#xff0c;继承自Exception或RuntimeException&#xff08;根据需要选择&#xff09;。 构造方法&#xff1a;提供一…...

2025/2/10 心得

第一题。J. C - Grand Garden (AI) 问题陈述 在一个花坛里&#xff0c;有 NN 朵花&#xff0c;编号为 1,2,\ldots,N1,2,…,N。最初&#xff0c;所有花的高度都是 00。你将得到一个高度序列 h{h\_1,h\_2,h\_3,\ldots\} 作为输入。你希望通过重复以下“浇水”操作来将所有花的编…...

Visual Studio 2022 中使用 Google Test

要在 Visual Studio 2022 中使用 Google Test (gtest)&#xff0c;可以按照以下步骤进行&#xff1a; 安装 Google Test&#xff1a;确保你已经安装了 Google Test。如果没有安装&#xff0c;可以通过 Visual Studio Installer 安装。在安装程序中&#xff0c;找到并选择 Googl…...

软开关和硬开关

硬开关&#xff1a; 电路结构相对简单&#xff0c;一般只包含基本的开关管、电源、负载等元件&#xff0c;没有专门的谐振电路来辅助开关过程。 开关管在导通或关断时&#xff0c;电压或电流的变化率非常快&#xff0c;形成急剧的开关过程。开通时&#xff0c;开关器件的电流…...

C++17中的std::clamp:限制值的范围

文章目录 一、背景与动机二、std::clamp的定义三、使用示例示例1&#xff1a;基本用法示例2&#xff1a;浮点数和自定义类型 四、实际应用场景1. 游戏开发2. 图形处理3. 数值计算 五、注意事项六、总结 在C17中&#xff0c; std::clamp是一个极为实用的算法&#xff0c;它能够…...