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

「一起学后端」Nest.js + MySQL 查询方法教学文档

Nest.js + MySQL 查询方法教学文档

文章目录

    • Nest.js + MySQL 查询方法教学文档
      • 1. 基础 CRUD 操作
        • 1.1 创建记录
        • 1.2 查询记录
        • 1.3 更新记录
        • 1.4 删除记录
      • 2. 复杂查询
        • 2.1 分页与排序
        • 2.2 关联查询(JOIN)
        • 2.3 聚合查询
        • 2.4 子查询
      • 3. 高级操作
        • 3.1 事务处理
        • 3.2 TypeORM 中实现事务的两种方式
        • 3.3 事务中的错误处理
        • 3.4 原生 SQL 查询
        • 3.5 软删除与恢复
      • 4. 装饰器(@)使用大全
        • 4.1 TypeORM 实体装饰器
        • 4.2 DTO 验证装饰器
        • 4.3 装饰器组合用法
      • 5. 实用技巧
        • 5.1 错误处理增强
        • 5.2 索引优化实战
        • 5.3 索引的作用
        • 5.4 索引的代价
        • 5.5 何时创建索引?
        • 5.6 TypeORM 中创建索引
        • 5.7 索引命名与高级配置
      • 6. 完整项目结构
      • 7. 完整示例代码
        • 实体类示例
        • 服务类示例
      • 总结


1. 基础 CRUD 操作

1.1 创建记录
// 创建一个用户对象(此时还未保存到数据库)
const user = this.userRepository.create({name: 'John',age: 25, 
});// 将创建的对象保存到数据库
await this.userRepository.save(user);// 批量创建示例
const users = this.userRepository.create([{ name: 'Alice', age: 30 },{ name: 'Bob', age: 28 },
]);
await this.userRepository.save(users);

1.2 查询记录
// 查询所有用户
const allUsers = await this.userRepository.find();// 条件查询:年龄大于20的用户,带分页(第1页,每页10条)
const filteredUsers = await this.userRepository.find({where: { age: MoreThan(20) }, // MoreThan 是 TypeORM 的比较操作符skip: 0,  // 跳过0条 = 第一页take: 10, // 取10条
});// 查询单个用户(根据ID)
const user = await this.userRepository.findOneBy({ id: 1 });// 查询并按创建时间倒序排列
const sortedUsers = await this.userRepository.find({order: { createdAt: 'DESC' } // DESC 降序,ASC 升序
});

1.3 更新记录
// 直接更新(适合简单操作)
await this.userRepository.update({ id: 1 },  // 更新条件(找到id=1的用户){ age: 26 } // 更新内容
);// 先查询后更新(推荐:可以处理复杂业务逻辑)
const user = await this.userRepository.findOneBy({ id: 1 });
user.age = 26; // 修改属性
await this.userRepository.save(user); // 保存修改

1.4 删除记录
// 物理删除(直接从数据库删除)
await this.userRepository.delete({ id: 1 });// 软删除(需要实体类添加 @DeleteDateColumn)
await this.userRepository.softDelete({ id: 1 });
// 软删除后,数据不会被真正删除,而是标记删除时间

2. 复杂查询

2.1 分页与排序
// 分页查询用户列表(带总数统计)
const [users, total] = await this.userRepository.findAndCount({where: { isActive: true }, // 查询条件:仅活跃用户skip: (page - 1) * limit,  // 跳过前 N 条(计算页码偏移量)take: limit,               // 每页数量order: { createdAt: 'DESC' }, // 按创建时间倒序排列
});// 返回结果示例:
// {
//   data: users,  // 当前页数据
//   total: 100,   // 总数据量
//   page: 2,      // 当前页码
//   totalPages: 10 // 总页数
// }

2.2 关联查询(JOIN)
// 方式1:自动关联查询(需在实体类中预先定义关联关系)
const orders = await this.orderRepository.find({relations: ['user'], // 加载关联的 user 数据
});// 方式2:使用 QueryBuilder 手动关联(更灵活)
const orders = await this.orderRepository.createQueryBuilder('order')          // 主表别名.leftJoinAndSelect('order.user', 'user') // 关联 user 表,别名为 user.where('user.age > :age', { age: 18 })   // 条件:用户年龄大于18岁.getMany();                          // 获取最终结果

2.3 聚合查询
// 计算用户平均年龄
const result = await this.userRepository.createQueryBuilder('user')        // 使用别名 'user' 代表用户表.select('AVG(user.age)', 'avgAge') // 计算年龄平均值,结果命名为 avgAge.getRawOne();                      // 获取原始数据(不经过实体转换)console.log(result.avgAge); // 直接通过别名访问结果// 统计活跃用户数量
const activeUserCount = await this.userRepository.count({ where: { isActive: true } 
});

2.4 子查询
// 步骤1:构建子查询(获取年龄大于20的用户ID)
const subQuery = this.userRepository.createQueryBuilder('user').select('user.id').where('user.age > :age', { age: 20 });// 步骤2:在主查询中使用子查询
const users = await this.userRepository.createQueryBuilder('user').where(`user.id IN (${subQuery.getQuery()})`) // 嵌入子查询.setParameters(subQuery.getParameters())     // 传递子查询参数(防SQL注入).getMany();

3. 高级操作

3.1 事务处理

想象你要完成以下操作:

  1. 从A账户扣除100元
  2. 向B账户增加100元

如果步骤1成功但步骤2失败,A账户的钱会凭空消失!事务的作用就是确保这两个步骤绑定成一个原子操作:要么全部成功,要么全部回滚(撤销所有操作)。

当需要同时执行多个数据库操作,并确保它们全部成功或全部失败时(比如转账操作),使用事务。

// 使用 DataSource 对象管理事务
await this.dataSource.transaction(async (transactionManager) => {// 在事务中创建用户const user = transactionManager.create(User, { name: 'Alice' });await transactionManager.save(user);// 在事务中更新用户关联的 profileawait transactionManager.update(Profile, { userId: user.id }, { status: 'active' });
});
// 如果过程中任何一步出错,所有操作自动回滚

3.2 TypeORM 中实现事务的两种方式

方式1:transaction 方法(推荐)
直接使用 TypeORM 的 transaction API,自动管理事务的生命周期。

import { DataSource } from 'typeorm';// 在 Service 类中注入 DataSource
constructor(private dataSource: DataSource) {}// 示例:转账事务
async transferMoney(fromUserId: number, toUserId: number, amount: number) {await this.dataSource.transaction(async (transactionManager) => {// 注意:事务内的所有操作必须使用 transactionManager,而不是普通 repository// 1. 扣款await transactionManager.decrement(User, { id: fromUserId }, 'balance', amount);// 2. 收款await transactionManager.increment(User, { id: toUserId }, 'balance', amount);// 3. 记录交易日志(事务内操作)await transactionManager.insert(TransactionLog, {fromUser: fromUserId,toUser: toUserId,amount,});});// 如果以上任何一步出错,所有操作自动回滚
}

关键点解释:

代码部分说明
transactionManager事务管理器对象,在事务内必须用它代替普通 repository 执行数据库操作
decrement / incrementTypeORM 内置的快捷方法,用于字段的增减操作
自动错误回滚如果事务内抛出任何错误(如数据库错误、手动 throw),所有操作自动撤销

方式2:QueryRunner 手动控制(更灵活)
适合需要精细控制事务(如中途提交或回滚)的场景。

async manualTransactionDemo() {// 1. 创建 QueryRunnerconst queryRunner = this.dataSource.createQueryRunner();try {// 2. 建立数据库连接并启动事务await queryRunner.connect();await queryRunner.startTransaction();// 3. 执行事务操作(通过 queryRunner.manager)await queryRunner.manager.update(User, { id: 1 }, { balance: 100 });await queryRunner.manager.delete(Order, { userId: 1 });// 4. 手动提交事务(只有提交后操作才生效)await queryRunner.commitTransaction();} catch (error) {// 5. 出错时回滚await queryRunner.rollbackTransaction();throw new Error('事务执行失败');} finally {// 6. 释放连接(重要!)await queryRunner.release();}
}

两种方式对比:

方式优点缺点适用场景
transaction自动管理连接和事务,代码简洁灵活性较低大多数常规场景
QueryRunner完全手动控制,灵活性高代码量大,需手动释放连接需要分段提交或复杂事务控制

3.3 事务中的错误处理

确保回滚的两种方法

  1. 自动回滚:事务内任何未捕获的异常(如数据库错误、手动 throw)都会触发回滚。
  2. 手动回滚:在 catch 块中调用 rollbackTransaction()(仅限 QueryRunner 方式)。
// 示例:在事务中检查业务条件
await this.dataSource.transaction(async (manager) => {const user = await manager.findOneBy(User, { id: 1 });// 业务逻辑错误也触发回滚if (user.balance < 100) {throw new Error('余额不足'); // 抛出错误 → 自动回滚}// ...其他操作
});

实际应用场景

  1. 金融交易:转账、支付、退款
  2. 订单系统:创建订单 → 扣减库存 → 生成物流单
  3. 用户注册:创建用户 → 初始化配置 → 发送欢迎消息(注意:外部API调用需额外处理)

注意事项

  1. 避免长事务:事务执行时间过长会导致数据库锁表,影响性能。
  2. 事务嵌套:TypeORM 支持嵌套事务,但不同数据库行为可能不同(需谨慎使用)。
  3. 隔离级别:默认使用数据库的隔离级别,可通过 SET TRANSACTION ISOLATION LEVEL 调整。

3.4 原生 SQL 查询

当 TypeORM 的 API 无法满足复杂查询需求时,可以直接写 SQL。

// 执行原生 SQL 查询(参数化查询防止 SQL 注入)
const rawData = await this.userRepository.query('SELECT * FROM users WHERE age > ? AND is_active = ?', [18, true] // 参数按 ? 顺序传递
);// 示例结果:返回原始数据库结果(字段名与数据库一致)
// [ { id: 1, name: 'John', age: 25, is_active: 1 }, ... ]

3.5 软删除与恢复

软删除不会真正删除数据,而是通过标记时间字段实现“伪删除”。

步骤 1:在实体类中添加 @DeleteDateColumn

import { DeleteDateColumn } from 'typeorm';@Entity()
export class User {// ...其他字段@DeleteDateColumn({ name: 'deleted_at' }) // 字段名可自定义deletedAt: Date; // 当调用 softDelete 时,此字段会自动记录删除时间
}

步骤 2:操作示例

// 软删除用户(id=1)
await this.userRepository.softDelete({ id: 1 });// 恢复被软删除的用户
await this.userRepository.restore({ id: 1 });// 查询时默认排除已软删除的数据
const activeUsers = await this.userRepository.find();// 查询包含已删除的数据
const allData = await this.userRepository.find({ withDeleted: true, // 显式包含已删除数据
});

4. 装饰器(@)使用大全

以下整理 Nest.js 项目中常见的装饰器用法,涵盖 TypeORM 实体定义DTO 验证 两大场景:


4.1 TypeORM 实体装饰器

用于定义数据库表结构的装饰器,需在实体类(Entity Class)中使用。

装饰器名称用途示例代码备注
@Entity()标记一个类为数据库实体@Entity('users')可指定表名,如不写则默认使用类名(小写)
@Column()定义普通字段@Column({ type: 'varchar', length: 50 })支持配置类型、长度、是否可为空等
@PrimaryGeneratedColumn定义自增主键@PrimaryGeneratedColumn()默认类型为 int,可选 uuid 类型
@CreateDateColumn自动记录记录创建时间@CreateDateColumn({ name: 'create_time' })由数据库自动填充时间
@UpdateDateColumn自动记录记录更新时间@UpdateDateColumn()每次更新时自动刷新
@DeleteDateColumn软删除标记字段(需配合 softDelete 使用)@DeleteDateColumn()删除时自动填充时间,未删除时为 null
@Index()为字段创建数据库索引@Index(['email'], { unique: true })提升查询效率,unique 表示唯一约束
@OneToMany / @ManyToOne定义表关联关系(一对多/多对一)@OneToMany(() => Order, (order) => order.user)
@ManyToOne(() => User)
需在关联的实体类中双向定义

4.2 DTO 验证装饰器

用于请求参数验证(搭配 class-validator),需在 DTO 类中使用。

装饰器名称用途示例代码可配置选项
@IsString()验证字段是否为字符串@IsString({ message: '必须为字符串' })message: 自定义错误消息
@Length()验证字符串长度范围@Length(3, 20, { message: '长度3-20字符' })min: 最小长度
max: 最大长度
@IsEmail()验证是否为合法邮箱格式@IsEmail({}, { message: '邮箱格式错误' })可配置邮箱格式规则
@IsInt()验证是否为整数@IsInt()-
@Min() / @Max验证数字最小值/最大值@Min(18) @Max(100)配置数值范围
@IsOptional()允许字段为 nullundefined@IsOptional()通常用于可选参数
@IsNotEmpty()验证字段不能为空(空字符串、null、undefined)@IsNotEmpty()确保必填项
@IsBoolean()验证是否为布尔值@IsBoolean()-
@IsDate()验证是否为日期格式@IsDate()-

4.3 装饰器组合用法
// 示例:用户注册 DTO
export class CreateUserDto {@IsString()@Length(3, 20)name: string;@IsEmail()email: string;@IsInt()@Min(18)age: number;@IsOptional()@IsString()address?: string;
}

5. 实用技巧

5.1 错误处理增强

在全局过滤器(Global Filter)中统一处理数据库错误:

// 示例:捕获 TypeORM 错误并返回友好提示
@Catch(QueryFailedError)
export class DatabaseExceptionFilter implements ExceptionFilter {catch(exception: QueryFailedError, host: ArgumentsHost) {const response = host.switchToHttp().getResponse();// 处理重复键错误(如唯一约束冲突)if (exception.driverError?.code === 'ER_DUP_ENTRY') {response.status(400).json({ message: '数据已存在' });} else {response.status(500).json({ message: '数据库操作失败' });}}
}

5.2 索引优化实战

合理使用索引可显著提升查询性能:

// 在用户实体中为常用查询字段添加索引
@Entity()
@Index(['email'], { unique: true }) // 唯一索引
@Index(['age', 'createdAt'])       // 复合索引
export class User {// ...
}

5.3 索引的作用

索引相当于数据库的“目录”,能快速定位数据,核心作用

  • 加速查询:特别是 WHEREJOINORDER BY 等操作
  • 保证唯一性:唯一索引防止重复数据(如用户名、手机号)
  • 减少全表扫描:避免逐行查找,降低数据库负载

5.4 索引的代价
  • 占用存储空间:索引需要额外的磁盘空间
  • 影响写入速度:每次增删改操作需同步更新索引
  • 维护成本:不合理的索引会拖慢性能

5.5 何时创建索引?
场景示例字段索引类型推荐
高频查询条件WHERE age > 18普通索引
唯一性约束字段email手机号唯一索引
排序或分组字段ORDER BY created_at DESC普通索引
多条件联合查询WHERE age > 18 AND city='北京'复合索引
外键关联字段user_id(关联查询)普通索引

5.6 TypeORM 中创建索引

单字段索引
直接在实体类字段上使用 @Index

@Entity()
export class User {@Column()@Index() // 为 email 字段创建普通索引email: string;@Column()@Index({ unique: true }) // 创建唯一索引username: string;
}

复合索引
为多个字段联合创建索引(注意字段顺序):

@Entity()
@Index(['lastName', 'firstName']) // 联合索引:lastName + firstName
export class User {@Column()firstName: string;@Column()lastName: string;
}

5.7 索引命名与高级配置
@Index('IDX_USER_AGE', ['age'], { unique: false, where: 'age > 18' })
@Entity()
export class User {@Column()age: number;
}
参数说明
'IDX_USER_AGE'自定义索引名称(推荐统一命名风格)
['age']索引字段(数组形式,复合索引填多个字段)
where条件索引(仅对符合条件的数据创建索引,减少索引大小)

6. 完整项目结构

src/
├── modules/
│   └── user/
│       ├── dto/
│       │   ├── create-user.dto.ts      # 创建用户DTO(带验证装饰器)
│       │   └── update-user.dto.ts
│       ├── entities/
│       │   └── user.entity.ts          # 用户实体(TypeORM装饰器)
│       ├── user.controller.ts          # API路由(@Get、@Post等)
│       └── user.service.ts             # 业务逻辑(包含所有查询方法)
├── common/
│   ├── filters/                        # 全局异常过滤器
│   └── decorators/                     # 自定义装饰器
└── app.module.ts                       # 主模块(数据库配置、模块注册)

7. 完整示例代码

实体类示例
// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn, Index } from 'typeorm';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()@Index({ unique: true })email: string;@Column()name: string;@Column()age: number;@CreateDateColumn()createdAt: Date;
}
服务类示例
// user.service.ts
@Injectable()
export class UserService {constructor(@InjectRepository(User)private userRepository: Repository<User>,) {}// 查询用户列表(分页)async getUsers(page: number, limit: number) {const [data, total] = await this.userRepository.findAndCount({skip: (page - 1) * limit,take: limit,});return { data, total, page, totalPages: Math.ceil(total / limit) };}
}

总结

通过 TypeORM 和 Nest.js 的结合,可以高效实现:

  • 安全的数据操作(事务、软删除)
  • 清晰的代码结构(实体、DTO、服务分层)
  • 强大的参数验证(装饰器组合)

建议在实际开发中:

  1. 优先使用 TypeORM 的高级查询方法(如 QueryBuilder)
  2. 始终验证用户输入(DTO + 装饰器)
  3. 合理使用索引优化查询性能

相关文章:

「一起学后端」Nest.js + MySQL 查询方法教学文档

Nest.js MySQL 查询方法教学文档 文章目录 Nest.js MySQL 查询方法教学文档1. 基础 CRUD 操作1.1 创建记录1.2 查询记录1.3 更新记录1.4 删除记录 2. 复杂查询2.1 分页与排序2.2 关联查询&#xff08;JOIN&#xff09;2.3 聚合查询2.4 子查询 3. 高级操作3.1 事务处理3.2 Typ…...

基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【学习笔记】LLM推理与部署

文章目录 1 [LLMs inference] quantization 量化整体介绍&#xff08;bitsandbytes、GPTQ、GGUF、AWQ&#xff09;2 [LLMs inference] quantization 量化整体介绍&#xff08;bitsandbytes、GPTQ、GGUF、AWQ&#xff09;3 [LLMs serving] openrouter & vllm host LLM 推理服…...

leetcode-134.加油站

油箱容积无限&#xff0c;要求能环岛&#xff0c;说明总共加起来的油是不少于消耗量的&#xff0c;这是唯一一个决定能否环岛的变量&#xff0c;只要油量够&#xff0c;那么必定有一段路是攒油的路&#xff0c;它供给后续的消耗&#xff0c;使得油箱总是不空。 如果油量足够&am…...

companion object和object 从kotlin转java分析

说明 companion object 中 companion类中的方法是普通的方法 在外部类中生成静态变量&#xff0c;静态companion 对象 object MyClass2 中 类中方法是普通方法 在MyClass2中生成静态变量&#xff0c;静态MyClass2对象&#xff0c; 一 companion object 使用 kotlin转java pa…...

检索增强生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在&#xff01;")loader PyPDFLoader(file_path)try:do…...

关于TVS管漏电流的问题?

问题描述&#xff1a; 在量产的带电池故事机生产中&#xff0c;工厂产线测试电流时&#xff0c;有1台机器电流比正常机器大10mA左右。 原因分析&#xff1a; 1、分析电路原理图&#xff0c;去除可能出现问题的电压或器件&#xff08;不影响系统&#xff09;&#xff0c;发现…...

2025前端面试题记录

vue项目目录的执行顺序是怎么样的&#xff1f; 1、package.json   在执行npm run dev时&#xff0c;会在当前目录寻找package.json文件&#xff0c;此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…...

Linux系统docker部署Ollama本地大模型及部署Hugging Face开源模型,ollama相关注意点,非ollama模型创建,模型量化,显存建议

本文主要描述在Linux系统使用docker部署ollama自有模型以及Hugging Face开源模型&#xff0c;也涉及到一些相关注意点&#xff0c;欢迎沟通讨论~ 拉取镜像 拉取ollama最新镜像&#xff1a;docker pull ollama/ollama:latest 运行ollama 执行&#xff1a;docker run -d --res…...

.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar

示例代码下载&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi&#xff0c;开发人员需要新的策略来保持高效。本文探讨了这些变化&#xff0c;并介…...

C++——权限初识

权限初识 C中的访问权限主要分为三种&#xff1a; public 、 private 和 protected 。这些权限决定了类成员&#xff08;包括数据成员和成员函数&#xff09;的可访问性。以下是一个总结表格&#xff0c;说明了在不同情况下这些权限如何应用&#xff1a; 使用权限&#xff08;…...

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…...

如何在 Linux 系统中部署 FTP 服务器:从基础配置到安全优化

一、为什么选择 Linux 部署 FTP 服务器&#xff1f; FTP&#xff08;文件传输协议&#xff09;作为互联网最早的文件传输标准&#xff0c;至今仍在企业内部文件共享、镜像站点同步等场景中广泛应用。Linux 系统凭借其稳定性、开源特性及丰富的工具链&#xff0c;成为搭建 FTP 服…...

C++——引用

目录 举个例子&#xff1a; 引用的基本特性 引用的定义语法如下&#xff1a; 1. 引用必须初始化&#xff1a; 2. 引用是别名&#xff1a; 3. 引用不能为空&#xff1a; 4. 引用不能重新绑定&#xff1a; 引用的使用场景 函数参数传递&#xff1a; 函数返回值&#xf…...

unity开发效率提升笔记

本文将记录提升Unity开发效率的若干细节&#xff0c;持续更新 一.VSCode文件标签多行显示 1.File->Preference->Settings (快捷键Ctrl 逗号) 2.搜索workbench.editor.wrapTabs 3.勾选上这个单选开关 若依然不是多行 4.搜索workbench.editor.tabSizing,选择fi…...

VScode页面错误,可以编译C++20版本,但页面显示有错误的解决方案

问题回顾 学习信号量时使用到了C20版本的一些变量&#xff0c;可以正常编译和运行&#xff0c;但在编辑器上显示存在错误&#xff0c;如图所示 显示结果&#xff0c;提示命名空间std没有成员变量counting_semaphore&#xff0c;如图所示 解决办法 1、确保自己安装了C/C插件…...

[WEB开发] JDBC

一. JDBC基础 JDBC (Java DataBase Connectivity): 就是使用 java 语言操作数据库的一套API. JDBC本质: 一套标准接口, 规范各个数据库厂商实现这套接口, 提供驱动使用接口, 真正执行的是实现类 二. 实战 2.1 非预编译sql // 1. 注册数据库驱动Class.forName("com.my…...

Linux shell脚本2-test条件测试语句:文件类型、字符串是否相等、数字大小比较、多重条件判断,测试语句验证

目录 1.条件测试语句 2.文件表达式测试 2.1测试文件状态的条件表达式 2.2程序验证 2.2.1 单个文件验证 2.2.3.两个文件验证 3.字符串表达式测试 4.数字表达式测试 5.复合表达式测试 1.条件测试语句 在写shell脚本时&#xff0c;经常遇到的问题就是判断字符串是否相等&…...

linux_git使用

1. git的历史 git是开源的 2. git的理解 版本控制 只进行管理源文件 3. git的使用 3.1. git命令安装 sudo yum install git sudo apt install -y git 查看是否安装成功 $git --version 3.2. git使用注意事项 首次使用git需要输入用户名和邮件 gitignore&#xff1…...

Linux网络相关概念和重要知识(2)(UDP套接字编程、聊天室的实现、观察者模式)

目录 1.UDP套接字编程 &#xff08;1&#xff09;socket编程 &#xff08;2&#xff09;UDP的使用 ①socket ②bind ③recvfrom ④sendto 2.聊天室的实现 &#xff08;1&#xff09;整体逻辑 &#xff08;2&#xff09;对sockaddr_in的封装 &#xff08;3&#xff09…...

2025年03月18日柯莱特(外包宁德)一面前端面试

目录 自我介绍你怎么从0到1搭建项目的webpack 的构建流程手写webpack插件你有什么想问我的吗 2. 你怎么从 0 到 1 搭建项目的 在面试中回答从 0 到 1 搭建前端项目&#xff0c;可按以下详细步骤阐述&#xff1a; 1. 项目前期准备 需求理解与分析 和产品经理、客户等相关人…...

汇川EASY系列之以太网通讯(MODBUS_TCP做主站)

汇川Easy系列以太网通讯中(MODBUSTCP,plc做主站),终于可以不用使用指令就可以完成了,全程通过简单的配置就可通讯。本文将通过EASY系列PLC与调试助手之间完成此操作。具体演示如下; 关于主站和从站的介绍 A/请求:即主动方 向被动方发送的一个要求的信息。 B/主站:发…...

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二&#xff1a; rich-text | uni-app...

PyTorch中Batch Normalization1d的实现与手动验证

PyTorch中Batch Normalization1d的实现与手动验证 一、介绍 Batch Normalization&#xff08;批归一化&#xff09;是深度学习中常用的技术&#xff0c;用于加速训练并减少对初始化的敏感性。本文将通过PyTorch内置函数和手动实现两种方式&#xff0c;展示如何对三维输入张量…...

LoRA中黑塞矩阵、Fisher信息矩阵是什么

LoRA中黑塞矩阵、Fisher信息矩阵是什么 1. 三者的核心概念 黑塞矩阵(Hessian) 二阶导数矩阵,用于优化问题中判断函数的凸性(如牛顿法),或计算参数更新方向(如拟牛顿法)。 Fisher信息矩阵(Fisher Information Matrix, FIM) 统计学中衡量参数估计的不确定性,反映数据…...

Transformer中,Fisher矩阵与权重之间关系

Transformer中,Fisher矩阵与权重之间关系 目录 Transformer中,Fisher矩阵与权重之间关系一、Fisher矩阵与Transformer权重的关系二、Fisher矩阵的更新方式三、举例说明给出案例:Transformer权重矩阵,Fisher矩阵,说明对应关系和怎么更新二阶导数计算需要大量算力有什么方法…...

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步&#xff0c;就可以 点击搜索 Models &#xff1a; https://ollama.com/search然后点击下载&#xff1a; 选择后复制: ollama run deepseek-r1:32b例如&#xff1a; 让它安装完成后&#xff1…...

asp.net mvc 向前端响应json数据。用到jquery

最近在给客户开发提醒软件时&#xff0c;用asp.net mvc 开发。该框架已经集成了bootstrap,直接贴asp.net mvc 端代码&#xff1a; {Layout null; }<!DOCTYPE html><html> <head><meta name"viewport" content"widthdevice-width" /…...

《基于深度学习的指纹识别智能门禁系统》开题报告

个人主页&#xff1a;大数据蟒行探索者 1研究背景 1.1开发目的和意义 指纹识别作为生物特征识别领域的一项重要技术&#xff0c;在安全认证、犯罪侦查和个人身份验证等方面具有广泛应用前景。随着深度学习技术的迅猛发展&#xff0c;基于深度学习的指纹识别系统成为了当前研究…...

数据预处理流程与关键步骤解析

数据预处理流程图&#xff08;Markdown格式&#xff09;&#xff1a; #mermaid-svg-b3mhJcpFWaJ9qMZ8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-b3mhJcpFWaJ9qMZ8 .error-icon{fill:#552222;}#mermaid-svg-b3m…...

单片机开发资源分析实战——以STM32F103ZET6为例子,分析我们的单片机

目录 第一件事情&#xff1a;为什么叫STM32F103ZET6 分析我们的资源手册 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite ST…...

uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)

文章目录 **主要功能**1. **快速安装和管理 Python 包**2. **生成和管理锁文件 (requirements.lock)**3. **创建虚拟环境**4. **与 poetry 兼容** **核心优势**1. **极快的速度**&#xff1a;基于 Rust 实现&#xff0c;利用多线程和缓存大幅加速依赖解析。2. **轻量且独立**&a…...

React Native进阶(六十):webview实现屏蔽所嵌套web页面异常弹窗

文章目录 一、前言二、解决方案三、注意事项四、拓展阅读 一、前言 在React Native项目集成web页面时&#xff0c;webview嵌套方式是常用方式。如果所嵌套的web页面由于某种不可控因素导致出现错误弹窗信息&#xff0c;webview作为web嵌套方式应该对其行为可控。 React Nativ…...

IS-IS原理与配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO&#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNet…...

响应式CMS架构优化SEO与用户体验

内容概要 在数字化内容生态中&#xff0c;响应式CMS架构已成为平衡搜索引擎可见性与终端用户体验的核心载体。该系统通过多终端适配技术&#xff0c;确保PC、移动端及平板等设备的内容渲染一致性&#xff0c;直接降低页面跳出率并延长用户停留时长。与此同时&#xff0c;智能S…...

mysql 主从配置

核心概念&#xff1a; 主服务器&#xff08;Master&#xff09;&#xff1a;负责处理客户端的写操作&#xff0c;并将数据更改记录到二进制日志&#xff08;binlog&#xff09;中。从服务器&#xff08;Slave&#xff09;&#xff1a;负责读取主服务器的二进制日志&#xff0c;…...

Windows下编译安装Qt5.15.0指南

1. 系统要求 操作系统: Windows 7 或更高版本&#xff08;推荐 Windows 10/11&#xff09;。 磁盘空间: 至少 20-30 GB&#xff08;编译过程会生成大量中间文件&#xff09;。 内存: 建议 8GB 或更高。 编译器: 需要安装 Visual Studio&#xff08;推荐 MSVC 2017 或 MSVC 2…...

001-JMeter的安装与配置

1.前期准备 下载好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下载好JDK : :Java Downloads | Oracle 中国 下载图中圈蓝的JMeter和JDK就行&#xff0c;让它边下载&#xff0c;我们边往下看 2.为什么要下载并安装JDK ? JMeter 是基于 Java 开发的工具&#…...

kube-score K8S Yaml静态代码分析工具详解

kube-score 是一款专注于 Kubernetes 配置文件的静态代码分析工具&#xff0c;旨在通过自动化检查帮助用户识别资源配置中的潜在问题&#xff0c;并遵循最佳实践以提升集群的安全性、稳定性和性能。以下是其核心功能、使用方法和应用场景的详细解析&#xff1a; 一、核心功能与…...

【Go】Go语言结构体笔记

整体介绍 虽然 Go 语言不是传统意义上的面向对象语言&#xff0c;但它提供了结构体&#xff08;struct&#xff09;来组织数据&#xff0c;并且可以为结构体绑定方法&#xff0c;从而达到面向对象的部分效果。 关键知识点包括&#xff1a; 结构体定义与实例化 定义结构体时使用…...

Oracle数据库性能优化全攻略:十大关键方向深度解析与实践指南

文章目录 一、SQL查询优化二、索引优化三、内存管理四、I/O优化五、分区表与分区索引六、并行处理七、统计信息管理八、锁与并发控制九、数据库参数调优十、应用设计优化结论 在当今数据驱动的时代&#xff0c;数据库的性能优化成为了确保企业应用高效运行的关键。Oracle作为业…...

Modern C++面试题及参考答案

目录 解释右值引用的定义及其与左值引用的核心区别 std::move 的实现原理是什么?为什么它本身不执行移动操作? 移动构造函数与拷贝构造函数的调用场景有何不同? 实现一个支持移动语义的类需要遵循哪些原则? 完美转发(Perfect Forwarding)的实现原理及 std::forward 的…...

【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用

一、液晶显示技术简介 1.RGB信号线 RGB是一种色彩模式&#xff0c;是工业界的一种颜色标准&#xff0c;是通过红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三个颜色通道的变化&#xff0c;以及它们相互之间的叠加来得到各式各样的…...

Git push后撤销提交

一、介绍 当某次更改完工程后&#xff0c;push了本地仓库到云端&#xff0c;但是发现有地方改错了&#xff0c;想撤销这次推送&#xff0c;或者某次提交就更改了很小一部分&#xff0c;想和本地这次修改的合并为一次推送&#xff0c;省的在云端显示特别多次提交&#xff0c;显得…...

React多层级对象改变值--immer

reduxjs/toolkit底层就是immer&#xff0c;&#xff0c;&#xff0c;所以在使用redux的时候&#xff0c;直接赋值&#xff0c;就会响应式的数据 如果不使用reduxjs/toolkit,可以自己使用immer来实现 安装immer npm install immer引入produce函数&#xff0c;&#xff0c;prod…...

17153. 班级活动(蓝桥杯-python)

代码写法 import os import sys# 请在此输入您的代码n int(input()) a list(map(int,input().split()))da {} flag1 0 flag2 0for i in a:da[i] da.get(i,0)1for i,j in da.items():if j 1:flag1 1if j > 2:flag2 j-2if flag2 > flag1:print(flag2) else:print(…...

html5-qrcode前端打开摄像头扫描二维码功能

实现的效果如图所示&#xff0c;全屏打开并且扫描到二维码后弹窗提醒&#xff0c;主要就是使用html5-qrcode这个依赖库&#xff0c;html5-qrcode开源地址&#xff1a;GitHub - mebjas/html5-qrcode: A cross platform HTML5 QR code reader. See end to end implementation at:…...

【后端】【Django】【ORM】SearchFilter 详解

SearchFilter 详解 SearchFilter 是 Django REST Framework&#xff08;DRF&#xff09;提供的一个过滤器&#xff0c;用于在 ModelViewSet 视图集中支持搜索功能。它允许用户通过 URL 查询参数&#xff08;默认 search&#xff09;对多个字段进行模糊匹配。 一、基本用法 &a…...

python 实现一个简单的window 任务管理器

import tkinter as tk from tkinter import ttk import psutil# 运行此代码前&#xff0c;请确保已经安装了 psutil 库&#xff0c;可以使用 pip install psutil 进行安装。 # 由于获取进程信息可能会受到权限限制&#xff0c;某些进程的信息可能无法获取&#xff0c;代码中已经…...

使用密码连接Redis服务的两种方式

说明&#xff1a;本文介绍连接需要密码的Redis服务的两种方式 方式一 连接时&#xff0c;携带密码&#xff0c;如下&#xff1a; redis-cli -a [密码]如下&#xff1a; 有两个问题&#xff1a; 密码直接放在命令里&#xff0c;可通过 history 找到&#xff0c;不安全&#x…...