【测开能力提升-fastapi框架】fastapi能力提升 - ORM增删改查操作

1 ORM操作

注释:
fastapi缺少合适的ORM,官方推荐:sqlalchemy,但我们就不听官方的话,我们选择使用Tortoise ORM,因为他是支持异步的

1.1 tortoise ORM支持的数据库

  1. PostgreSQL(使用asyncpg)
  2. SQLite(使用aiosqlite)
  3. Mysql、MariaDB(使用aipmysql或者asyncmy)

1.2 创建ORM模型

(示例: b站上的选课系统)
1、下载tortoise-orm

pip install tortoise-orm

2、models.py

from tortoise.models import Model
from tortoise import fieldsclass Student(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=32, description="姓名")pwd = fields.CharField(max_length=32, description="密码")sno = fields.IntField(description="学号")# 一对多关系chas = fields.ForeignKeyField("models.Clas", related_name="students")# 多对多courses = fields.ManyToManyField("models.Course", related_name="students")class Clas(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=32, description="班级名称")teacher = fields.ForeignKeyField("models.Teacher", related_name="courses")class Course(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=32, description="课程名称")class Teacher(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=32, description="教师名称")tno = fields.IntField(description="教师号")  

1.3 ORM数据迁移

注释:
使用aerich迁移工具进行ORM数据迁移

3、main.py

import uvicorn
from fastapi import FastAPI
from tortoise.contrib.fastapi import register_tortoise
from settings import TORTOISE_ORMapp = FastAPI()register_tortoise(app=app, config=TORTOISE_ORM)if __name__ == "__main__":uvicorn.run("main:app", port=5050, reload=True)

4、TORTOISE_ORM配置信息
settings.py

TORTOISE_ORM = {"connections": {"default": {# 数据库配置(目前配置mysql)# "engine": "tortoise.backends.asyncpg""engine": "tortoise.backends.mysql","credentials": {"host": "127.0.0.1","port": "3306","user": "root","password": "111111","database": "htai","minsize": 1,"maxsize": 5,"charset": "utf8mb4","echo": True}},},# 迁移模型应用配置,后必须添加aerich.models,是serich默认配置"apps": {"models": {"models": ["models", "aerich.models"],"default_connection": "default",}},"use_tz": False,"timezone": "Asia/Shanghai"
}

5、安装aerich

pip install aerich

6、初始化配置信息,仅需执行一次

aerich init -t settings.TORTOISE_ORM # TORTOISE_ORM配置的位置

7、初始化数据库,仅需执行一次

aerich init-db

注释:更新模型并重新迁移
aerich migrate [–name](标记修改操作) # aerich migrate --name add_column
升级:aerich upgrade
降级:aerich downgrade

1.4 restful规范

注释:
GET: 查询
POST:添加
PUT:修改
DELETE:删除

api/student.py

from fastapi import APIRouterstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():return {"message": "查看所有的学生"}@student_api.post('/')
async def addStudent():return {"message": "添加一个学生"}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):return {"message": "查了id为{0}的学生".format(student_id)}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int):return {"message": "更新id为{0}的学生".format(student_id)}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):return {"message": "删除一个id为{0}学生".format(student_id)}
import uvicorn
from fastapi import FastAPI
from tortoise.contrib.fastapi import register_tortoise
from settings import TORTOISE_ORM
from api.student import student_apiapp = FastAPI()
app.include_router(student_api, prefix="/student", tags=["选课系统的学生接口"])register_tortoise(app=app, config=TORTOISE_ORM)if __name__ == "__main__":uvicorn.run("main:app", port=5050, reload=True)

在这里插入图片描述

1.5 tortoise_orm查询语句操作

api/student.py

@student_api.get('/')
async def getAllStudent():# 1. 查询students表中所有数据,拿到一个Queryset类型数据student_1 = await Student.all()# 打印每一个学生的姓名和学号 (一定要异步化)for stu in student_1:print(stu.name, stu.sno)# 2. 过滤查询 filterstudent_2 = await Student.filter(name="rain")# 3. 筛选class_id为2的学生student_3 = await Student.filter(clas_id=2)# 4. 获取查询 get 和filter区别:filter返回的是Query_set,get返回的是模型类对象student_4 = await Student.get(id=6)# 5. 模糊查询:例:查询学号大于2001的所有学生student_5 = await Student.filter(sno__gt=2001)# 6. 例:取出学号是2001和2002的学生student_6 = await Student.filter(sno_in=[2001, 2002])# 7. 例:取出学号在2001到2005之间的学生student_7 = await Student.filter(sno_range=[2001, 2002])# 8. values查询 单个值student_8 = await Student.all().values("name")# 9. values查询 多个值student_9 = await Student.all().values("name", "sno")return {"message": "查看所有的学生"}

1.6 ORM响应页面数据

api/student.py

from fastapi import APIRouter, Request
from models import *
from fastapi.templating import Jinja2Templatesstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():templates = Jinja2Templates(directory="templates")# 1. 查询students表中所有数据,拿到一个Queryset类型数据student = await Student.all()return templates.TemplateResponse("index.html", {"request": Request,"student":student})@student_api.post('/')
async def addStudent():return {"message": "添加一个学生"}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):return {"message": "查了id为{0}的学生".format(student_id)}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int):return {"message": "更新id为{0}的学生".format(student_id)}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):return {"message": "删除一个id为{0}学生".format(student_id)}

1.7 ORM添加语句操作

api/student.py

from typing import Listfrom fastapi import APIRouter, Request
from pydantic import BaseModel, field_validatorfrom models import *
from fastapi.templating import Jinja2Templatesstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():templates = Jinja2Templates(directory="templates")# 1. 查询students表中所有数据,拿到一个Queryset类型数据student = await Student.all()return templates.TemplateResponse("index.html", {"request": Request,"student":student})class StudentIn(BaseModel):id: intname: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):assert value.isalpha(), "name must be alpha"return value@field_validator("sno")def sno_validate(cls, value):assert 1000<=value<=10000, "学号要在1000-10000范围内"return value@student_api.post('/')
async def addStudent(student_in: StudentIn):# 插入到数据库中# 方式一student = Student(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)await student.save()# 方式二student_1 = await Student.create(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)return {"message": student_1}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):return {"message": "查了id为{0}的学生".format(student_id)}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int):return {"message": "更新id为{0}的学生".format(student_id)}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):return {"message": "删除一个id为{0}学生".format(student_id)}

1.8 ORM多对多添加语句操作

api/student.py

from typing import Listfrom fastapi import APIRouter, Request
from pydantic import BaseModel, field_validatorfrom models import *
from fastapi.templating import Jinja2Templatesstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():templates = Jinja2Templates(directory="templates")# 1. 查询students表中所有数据,拿到一个Queryset类型数据student = await Student.all()return templates.TemplateResponse("index.html", {"request": Request,"student":student})class StudentIn(BaseModel):id: intname: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):assert value.isalpha(), "name must be alpha"return value@field_validator("sno")def sno_validate(cls, value):assert 1000<=value<=10000, "学号要在1000-10000范围内"return value@student_api.post('/')
async def addStudent(student_in: StudentIn):# 插入到数据库中# 方式一student = Student(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)await student.save()# 方式二student_1 = await Student.create(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)# 多对多的关系绑定choose_course = await Course.filter(id__in=student_in.courses)student.courses.add(*choose_course)return {"message": student_1}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):return {"message": "查了id为{0}的学生".format(student_id)}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int):return {"message": "更新id为{0}的学生".format(student_id)}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):return {"message": "删除一个id为{0}学生".format(student_id)}

1.8 ORM一对多,多对多查询语句操作

api/student.py

from typing import Listfrom fastapi import APIRouter, Request
from pydantic import BaseModel, field_validatorfrom models import *
from fastapi.templating import Jinja2Templatesstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():templates = Jinja2Templates(directory="templates")# 1. 查询students表中所有数据,拿到一个Queryset类型数据student = await Student.all()# 查一个学生的一对多查询alvin = await Student.get(name='alvin')await alvin.clas.values("name")# 多对多查询student_8 = await alvin.courses.all()student_9 = await Student.all().values("name", "clas__name", "courses__name")# 查所有学生的一对多查询students_7 = await Student.all().values("name", "clas__name")return templates.TemplateResponse("index.html", {"request": Request,"student":student})class StudentIn(BaseModel):id: intname: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):assert value.isalpha(), "name must be alpha"return value@field_validator("sno")def sno_validate(cls, value):assert 1000<=value<=10000, "学号要在1000-10000范围内"return value@student_api.post('/')
async def addStudent(student_in: StudentIn):# 插入到数据库中# 方式一student = Student(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)await student.save()# 方式二student_1 = await Student.create(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)# 多对多的关系绑定choose_course = await Course.filter(id__in=student_in.courses)student.courses.add(*choose_course)return {"message": student_1}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):return {"message": "查了id为{0}的学生".format(student_id)}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int):return {"message": "更新id为{0}的学生".format(student_id)}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):return {"message": "删除一个id为{0}学生".format(student_id)}

1.9 ORM查询一个学生信息操作

api/student.py

from typing import Listfrom fastapi import APIRouter, Request
from pydantic import BaseModel, field_validatorfrom models import *
from fastapi.templating import Jinja2Templatesstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():templates = Jinja2Templates(directory="templates")# 1. 查询students表中所有数据,拿到一个Queryset类型数据student = await Student.all()# 查一个学生的一对多查询alvin = await Student.get(name='alvin')await alvin.clas.values("name")# 多对多查询student_8 = await alvin.courses.all()student_9 = await Student.all().values("name", "clas__name", "courses__name")# 查所有学生的一对多查询students_7 = await Student.all().values("name", "clas__name")return templates.TemplateResponse("index.html", {"request": Request,"student":student})class StudentIn(BaseModel):id: intname: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):assert value.isalpha(), "name must be alpha"return value@field_validator("sno")def sno_validate(cls, value):assert 1000<=value<=10000, "学号要在1000-10000范围内"return value@student_api.post('/')
async def addStudent(student_in: StudentIn):# 插入到数据库中# 方式一student = Student(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)await student.save()# 方式二student_1 = await Student.create(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)# 多对多的关系绑定choose_course = await Course.filter(id__in=student_in.courses)student.courses.add(*choose_course)return {"message": student_1}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):student = await Student.get(id=student_id)return {"message": "查了id为{0}的学生".format(student_id), "student": student}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int):return {"message": "更新id为{0}的学生".format(student_id)}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):return {"message": "删除一个id为{0}学生".format(student_id)}

1.9 ORM更新接口操作

api/student.py

from typing import Listfrom fastapi import APIRouter, Request
from pydantic import BaseModel, field_validatorfrom models import *
from fastapi.templating import Jinja2Templatesstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():templates = Jinja2Templates(directory="templates")# 1. 查询students表中所有数据,拿到一个Queryset类型数据student = await Student.all()# 查一个学生的一对多查询alvin = await Student.get(name='alvin')await alvin.clas.values("name")# 多对多查询student_8 = await alvin.courses.all()student_9 = await Student.all().values("name", "clas__name", "courses__name")# 查所有学生的一对多查询students_7 = await Student.all().values("name", "clas__name")return templates.TemplateResponse("index.html", {"request": Request,"student":student})class StudentIn(BaseModel):id: intname: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):assert value.isalpha(), "name must be alpha"return value@field_validator("sno")def sno_validate(cls, value):assert 1000<=value<=10000, "学号要在1000-10000范围内"return value@student_api.post('/')
async def addStudent(student_in: StudentIn):# 插入到数据库中# 方式一student = Student(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)await student.save()# 方式二student_1 = await Student.create(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)# 多对多的关系绑定choose_course = await Course.filter(id__in=student_in.courses)student.courses.add(*choose_course)return {"message": student_1}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):student = await Student.get(id=student_id)return {"message": "查了id为{0}的学生".format(student_id), "student": student}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int, student_in: StudentIn):data = student_in.dict()courses = data.pop("courses")await Student.filter(id=student_id).update(**data)# 设置多对多的选修课edit_stu = Student.get(id=student_id)choose_courses = Course.filter(id__in=courses)await edit_stu.courses.clear()edit_stu.courses.add(*choose_courses)return {"message": "更新id为{0}的学生".format(student_id), "student": edit_stu}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):return {"message": "删除一个id为{0}学生".format(student_id)}

1.10 ORM删除接口操作

api/student.py

from typing import Listfrom fastapi import APIRouter, Request
from pydantic import BaseModel, field_validatorfrom models import *
from fastapi.templating import Jinja2Templates
from fastapi.exceptions import HTTPExceptionstudent_api = APIRouter()@student_api.get('/')
async def getAllStudent():templates = Jinja2Templates(directory="templates")# 1. 查询students表中所有数据,拿到一个Queryset类型数据student = await Student.all()# 查一个学生的一对多查询alvin = await Student.get(name='alvin')await alvin.clas.values("name")# 多对多查询student_8 = await alvin.courses.all()student_9 = await Student.all().values("name", "clas__name", "courses__name")# 查所有学生的一对多查询students_7 = await Student.all().values("name", "clas__name")return templates.TemplateResponse("index.html", {"request": Request,"student":student})class StudentIn(BaseModel):id: intname: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):assert value.isalpha(), "name must be alpha"return value@field_validator("sno")def sno_validate(cls, value):assert 1000<=value<=10000, "学号要在1000-10000范围内"return value@student_api.post('/')
async def addStudent(student_in: StudentIn):# 插入到数据库中# 方式一student = Student(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)await student.save()# 方式二student_1 = await Student.create(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno, clas_id=student_in.clas_id)# 多对多的关系绑定choose_course = await Course.filter(id__in=student_in.courses)student.courses.add(*choose_course)return {"message": student_1}@student_api.get('/{student_id}')
async def getOneStudent(student_id: int):student = await Student.get(id=student_id)return {"message": "查了id为{0}的学生".format(student_id), "student": student}@student_api.put('/{student_id}')
async def updateOneStudent(student_id: int, student_in: StudentIn):data = student_in.dict()courses = data.pop("courses")await Student.filter(id=student_id).update(**data)# 设置多对多的选修课edit_stu = Student.get(id=student_id)choose_courses = Course.filter(id__in=courses)await edit_stu.courses.clear()edit_stu.courses.add(*choose_courses)return {"message": "更新id为{0}的学生".format(student_id), "student": edit_stu}@student_api.delete("/{student_id}")
async def deleteOneStudent(student_id: int):deleteCount = await Student.filter(id=student_id).delete()if not deleteCount:raise HTTPException(status_code=404, detail="主键为{0}的学生不存在".format(student_id))return {"message": "删除一个id为{0}学生".format(student_id)}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上市公司产品市场竞争程度指数(1990-2023年)

数据来源&#xff1a;基础数据来源于上市公司年报以及证监会及统计局时间跨度&#xff1a; 1990-2023年数据范围&#xff1a;企业及行业层面数据指标&#xff1a;本数据包含赫芬达尔指数/行业集中度/勒纳指数三个数据: 行业代码 行业名称 统计截止日期 市场类型 是否…

指针!!C语言(第二篇)

目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外&#xff0c;今天我们来掌握一些新的知识就是数组与指针&#xff0c;第一个对数组名的了解&#xff…

#三元运算符(python/java/c)

引入&#xff1a;什么是三元运算符呢&#xff1f;无疑其操作元有三个&#xff0c;一个是条件表达式&#xff0c;剩余两个为值&#xff0c;条件表达式为真时运算取第一个值&#xff0c;为假时取第二个值。 一 Python true_expression if condition else false_expressi…

matlab永磁同步电机反馈试验装置的设计和永磁同步电机仿真

1、内容简介 略 85-可以交流、咨询、答疑 2、内容说明 略 摘要&#xff1a;得益于电力电子器件及控制技术的高速发展&#xff0c;使得电机的应用越来越方便及精确&#xff0c;适应了实际应用对电机性能及质量提出的更高要求和标准。同时电机测试技术也因为电力电子技术的发…

AI多模态实战教程:面壁智能MiniCPM-V多模态大模型问答交互、llama.cpp模型量化和推理

一、项目简介 MiniCPM-V 系列是专为视觉-语⾔理解设计的多模态⼤型语⾔模型&#xff08;MLLMs&#xff09;&#xff0c;提供⾼质量的⽂本输出&#xff0c;已发布4个版本。 1.1 主要模型及特性 &#xff08;1&#xff09;MiniCPM-Llama3-V 2.5&#xff1a; 参数规模: 8B性能…

将Excel或CSV文件导入MySQL

数据库信息 版本:mysql-5.7.22 字符集如下 一、将 Excel 文件导入 MySQL,此时 MySQL 中不存在该表。 在数据库中,右键-导入向导

刚刚 威尼斯影评人周公布 2024 年电影阵容 包括敏感纪录片《本土》

《本土》 威尼斯影评人周是威尼斯电影节专门为首次拍摄电影的人设立的侧边活动&#xff0c;该活动公布了第 39 届威尼斯电影节的七部竞赛片和两部非竞赛片的入选名单&#xff0c;第 39 届威尼斯电影节将于 8 月 28 日至 9 月 7 日举行。 较为及时的作品之一是美国导演迈克尔普…

【IntelliJ IDEA】一篇文章集合所有IDEA的所有设置

IntelliJ IDEA 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;其设置涵盖了多个方面&#xff0c;以满足不同开发者的需求和偏好。由于 IDEA 的设置相当复杂和详尽&#xff0c;这里无法在一篇简短的文章中详细介绍所有设置。然而&#xff0c;我可以提供一…

持续集成07--Jenkins配置Allure测试报告

前言 在持续集成&#xff08;CI&#xff09;流程中&#xff0c;自动化测试报告是评估软件质量和追踪问题的重要工具。Allure Framework作为一个轻量级且功能丰富的测试报告工具&#xff0c;能够生成详细的测试报告&#xff0c;帮助团队更好地理解测试结果。本章节“持续集成07-…

Java二十三种设计模式-装饰器模式(7/23)

装饰器模式&#xff1a;动态扩展功能的灵活之选 引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;用于在不修改对象自身的基础上&#xff0c;通过添加额外的职责来扩展对象的功能。 基础知识&#xff0c;java设计模式总体来说设计…

特征工程方法总结

方法有以下这些 首先看数据有没有重复值、缺失值情况 离散&#xff1a;独热 连续变量&#xff1a;离散化&#xff08;也成为分箱&#xff09; 作用&#xff1a;1.消除异常值影响 2.引入非线性因素&#xff0c;提升模型表现能力 3.缺点是会损失一些信息 怎么分&#xff1a;…

爬取百度图片,想爬谁就爬谁

前言 既然是做爬虫&#xff0c;那么肯定就会有一些小心思&#xff0c;比如去获取一些自己喜欢的资料等。 去百度图片去抓取图片吧 打开百度图片网站&#xff0c;点击搜索xxx&#xff0c;打开后&#xff0c;滚动滚动条&#xff0c;发现滚动条越来越小&#xff0c;说明图片加载…

3D 渲染一个房屋需要多长时间?

3D 渲染一个房屋总共需要 6-10 个工作日&#xff0c;主要取决于项目的复杂性和最终 3D 渲染的质量&#xff0c;图像越逼真&#xff0c;效果图渲染所需时间就越长。 1.3D建模 创建 3D 模型是第一步&#xff0c;所需时间可能因项目的复杂程度而有很大差异。一个简单的住宅渲染可…

D3.高精度

1.分类情况 AB、A-B、A*a、A/b A和B指的是超大超长整数&#xff0c;长度<1e6; a的值<10000&#xff1b; 2.大整数的存储 int 变量肯定是存不了这么大的数的&#xff0c;做法是将大整数先存到string字符串&#xff0c;再使用字符串的访问方式&#xff0c;将每一位数存到…

单机游戏分享:波与月夜之青莲单机游戏下载,2D和风动作游戏

在《波与月夜之青莲》中穿越一个充满神话和传奇的神秘世界。这是款丰富多彩的手绘冒险游戏&#xff0c;灵感来自于日本的民间传说。 扮演波&#xff0c;一朵从天而降的天体花&#xff0c;在一道古老而神秘的仪式中扮演关键的角色&#xff0c;展开一段神秘的旅程。使用你的传说…

一、C#概述

本文是网页版《C# 12.0 本质论》第一章解读。欲完整跟踪本系列文章&#xff0c;请关注并订阅我的Essential C# 12.0解读专栏。 前言 第一章的内容非常简单&#xff0c;毕竟仅仅是Introducing C#。不过正如《0.前言》所述&#xff0c;《C# 12.0本质论》本身就不是一本零基础的…

rv1126利用rkmedia、opencv、rockx……完成人脸识别

一、总体框架 视频采集、处理使用rkmedia&#xff1a;vi模块进行视频输入、rga模块进行视频处理 人脸识别&#xff1a;先获取rga输出码流&#xff0c;再调用rkmedia的模型对人脸进行推理&#xff08;线程1&#xff09; 打框框&#xff1a;opencv&#xff08;线程2&#xff0…

Golang | Leetcode Golang题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; func nthUglyNumber(n int) int {dp : make([]int, n1)dp[1] 1p2, p3, p5 : 1, 1, 1for i : 2; i < n; i {x2, x3, x5 : dp[p2]*2, dp[p3]*3, dp[p5]*5dp[i] min(min(x2, x3), x5)if dp[i] x2 {p2}if dp[i] x3 {p3}if dp[i] x5 {p5…

艾迈斯欧司朗与greenteg推出的突破性体温监测技术已成为全球铁人三项的关键技术支持

中国 上海&#xff0c;2024年7月22日——全球领先的光学解决方案供应商艾迈斯欧司朗&#xff08;瑞士证券交易所股票代码&#xff1a;AMS&#xff09;今日宣布&#xff0c;与知名合作伙伴greenteg携手推出的CORE传感器为耐力运动领域带来新变革——其体温监测技术已成为全球铁人…

分类预测 | Matlab实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断

分类预测 | Matlab实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断 目录 分类预测 | Matlab实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断分类效果基本介绍程序设计参考资料 分类效果 基本介绍 Matlab实现BES-LSSVM秃鹰算法优化最…