尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
同步和异步的核心区别
同步干完一件之后才能再干下一件事。遇到程序需要等待时程序卡死不动异步当遇到需要等待的事件 异步先去干其他的事件别的事情干完之后再后来干这个事件同步浪费CPU等待时间异步最大优化空闲时间如果用同步代码有人发起请求接口、查询数据库程序就卡死等待新来的请求全部排队 稍微多个请求就会卡顿、超时等问题异步的优势就是单线程就你能处理大量并发请求 不用频繁占用系统资源提升效率Tortoise-ORM集成ORM有以下特点效率高不用手动基础语句 复杂查询可以封装 不用手动拼接语句语法跟友好用python 就能操控数据库不用专门学习复杂的sql语句 对开发者等加友好Tortoise-ORM集成在做异步python 时候 使用ORM有时会卡死 整个程序运行不了 不符合异步开发的理念 而Tortoise-ORM刚好适合异步开发有以下特点原生异步:基于asyncio构建所有数据库操作都是异步的不会阻塞事件循环。Django风格的API:如果你用过Django ORM会发现语法非常熟悉上手极快。轻量级:专注于核心功能没有冗余的抽象层性能出色。完整的关系支持:支持外键、一对一、多对多等所有常见关系类型内置Pydantic 集成:可以通过 pydantic_model_creator 自动从 Tortoise 模型生成 Pydantic模型无缝对接FastAPI的请求/响应校验和传统同步ORM的区别Fastapi的用法getuser_router.get(/all) async def getAllUsers(): dataawait User.all() return {code:1,message:获取所有用户成功,data:data }user_router.get(/all) 括号里面可以自己定义变量名后面可以传值比如 id:int,name:ste 等user_router.get(/all/{id}/{name}) async def getAllUsers(id:int,name:str): dataawait User.all() return {code:1,message:获取所有用户成功,data:data }postuser_router.post(/save,summary保存用户) async def save_user(user: UserCreateRequest): user1await User.create( usernameuser.username, email user.email , phone user.phone, is_admin user.is_admin ) # await User.create(**dict(user)) return {code:1,message:保存用户成功,data:user1}如果是/{name}类型的 那么方法中传的数据变量名要与路径中的变量名相等url……/hello/1/ 路由就相等这个样子 path 可以为变量加约束 如class UserCreateRequest(BaseModel): username: strField( ..., min_length3, max_length50, description用户名, exampleadmin123 ) email: strField( ..., min_length5, max_length100, description邮箱, exampleadmintest.com ) phone: strField( None, min_length11, max_length11, description手机号, example13800138000 ) is_admin: boolField( False, description是否是管理员, exampleFalse )这是添加商品设置字段的的格式和校验下面就是添加的请求体 基本都是必填的 也可以为选填putuser_router.put(/update/{id},summary更新用户) async def update_user(id:int,user: UserCreate): user1 await User.get_or_none(idid) if not user1: return {code:0,message:用户不存在} # 1 # if user.username is not None: # user1.usernameuser.username # if user.email is not None: # user1.emailuser.email # if user.phone is not None: # user1.phoneuser.phone # if user.is_admin is not None: # user1.is_adminuser.is_admin # await user1.save() # 2 # 只把有值的字段变成字典排除掉未提供实际值的字段 # user_dictuser.dict(exclude_unsetTrue) # for key, value in user_dict.items(): # setattr(user1, key, value) # 使用 setattr() 方法动态设置属性 # await user1.save() # 3 user_dictuser.dict(exclude_unsetTrue) await User.filter(idid).update(**user_dict) return {code:1,message:修改成功,data:}修改内容有三个方法方法一user1 await User.get_or_none(idid) if not user1: return {code:0,message:用户不存在} # 1 # if user.username is not None: # user1.usernameuser.username # if user.email is not None: # user1.emailuser.email # if user.phone is not None: # user1.phoneuser.phone # if user.is_admin is not None: # user1.is_adminuser.is_admin # await user1.save() return {code:1,message:修改成功}方法不叫简单但是比较繁琐方法二user_router.put(/update/{id},summary更新用户) async def update_user(id:int,user: UserCreate): user1 await User.get_or_none(idid) if not user1: return {code:0,message:用户不存在} # 只把有值的字段变成字典排除掉未提供实际值的字段 user_dictuser.dict(exclude_unsetTrue) for key, value in user_dict.items(): setattr(user1, key, value) # 使用 setattr() 方法动态设置属性 await user1.save() return {code:1,message:修改成功}只把有值的字段变成字典排除掉未提供实际值的字段方法三user_router.put(/update/{id},summary更新用户) async def update_user(id:int,user: UserCreate): user_dictuser.dict(exclude_unsetTrue) await User.filter(idid).update(**user_dict) return {code:1,message:修改成功}这一块是要修改的内容deleteuser_router.delete(/delete/{id},summary删除用户) async def delete_user(id:int): # 1 # user1 await User.get_or_none(idid) # if user1 is None: # return {code:0,message:用户不存在} # await user1.delete() # 2 await User.filter(idid).delete() return {code:1,message:删除成功}在task中查找id 然后直接调用方法 delete就可以删除了 前面要加一个await挂载才可以使用
RELATED

相关推荐

k8s-sidecar健康检查机制详解:如何配置Kubernetes就绪性与存活探针

k8s-sidecar健康检查机制详解:如何配置Kubernetes就绪性与存活探针

k8s-sidecar健康检查机制详解:如何配置Kubernetes就绪性与存活探针 【免费下载链接】k8s-sidecar This is a docker container intended to run inside a kubernetes cluster to collect config maps with a specified label and store the included files in a loc…

📅 2026/9/8 13:41:21
Kronos金融大模型:让AI读懂K线语言,5分钟开启智能投资决策

Kronos金融大模型:让AI读懂K线语言,5分钟开启智能投资决策

Kronos金融大模型:让AI读懂K线语言,5分钟开启智能投资决策 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 在金融市场的波涛汹涌中…

📅 2026/9/8 8:02:33
保留旋律做风格改编的AI工具:6款AI音乐改编与Remix工具怎么选

保留旋律做风格改编的AI工具:6款AI音乐改编与Remix工具怎么选

改编和Remix最吸引人的地方,是熟悉的旋律能突然拥有另一种气质;最容易踩坑的地方,也恰恰是对现有音乐动手。先把底线说清楚:所有上传、解析、分轨、改词和曲风重制,都只应针对自己拥有完整权利,或已经取得明…

📅 2026/9/9 21:29:57
MORE NEWS

更多资讯

📰

Jupyter Notebook 贡献指南:从开发环境搭建到端到端测试的完整工程实践

Jupyter Notebook 贡献指南:从开发环境搭建到端到端测试的完整工程实践 【免费下载链接】notebook Jupyter Interactive Notebook 项目地址: https://gitcode.com/GitHub_Trending/no/notebook Jupyter Notebook 是一款基于 Web 的交互式计算笔记本环境&…

📰

TanStack Router 代码路由(Code-Based Routing)完全指南:用 `createRoute` 手工构建类型安全的路由树

TanStack Router 代码路由(Code-Based Routing)完全指南:用 createRoute 手工构建类型安全的路由树 【免费下载链接】router 🤖 A client-first, server-capable, fully type-safe router and full-stack framework for the web (…

📰

wordpress函数表避坑指南:3个细节省下5万开发费

wordpress函数表避坑指南:3个细节省下5万开发费 找建站公司怕被坑高价?别慌,这份避坑指南专治各种“隐形收费”。 很多老板在WordPress建站初期,为了省事直接让外包公司包办所有底层逻辑。结果呢?网站上线后想改个菜单样式,对方收…

📰

AI生成了百万行代码之后:工程治理、Codex实践与代码审查新范式

“AI写了100万行代码”这件事,先是成了一条新闻,随后变成了一个不太好回答的工程问题。OpenAI的确在大量使用AI生成的代码,这件事本身并不神秘,真正值得拆开看的,是他们怎么不让这一百万行代码变成一场事故。代码生成早…

📰

Power BI Desktop数据源连接全攻略:从文件、数据库到API与ODBC

做数据分析和报表开发这些年,我最大的体会是:Power BI Desktop里百分之八十的“疑难杂症”,最后都绕回到同一个起点——数据源没接好。很多人花大把时间研究DAX、调视觉效果,结果报表刷新不出来、数据对不上、性能卡成PPT&#xf…

📰

Telegraf 集成 systemd 凭据存储(systemd-creds)实现安全的明文凭据注入

Telegraf 集成 systemd 凭据存储(systemd-creds)实现安全的明文凭据注入 【免费下载链接】telegraf Agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data. 项目地址: https://gitcode.com/GitHub_Tr…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬