同步和异步的核心区别
2026/7/22 18:13:47 网站建设 项目流程

同步:干完一件之后才能再干下一件事。遇到程序需要等待时,程序卡死不动

异步:当遇到需要等待的事件 异步先去干其他的事件,别的事情干完之后再后来干这个事件

同步浪费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的用法

get

@user_router.get("/all") async def getAllUsers(): data=await 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): data=await User.all() return {"code":1,"message":"获取所有用户成功","data":data }

post

@user_router.post("/save",summary="保存用户") async def save_user(user: UserCreateRequest): user1=await User.create( username=user.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: str=Field( ..., min_length=3, max_length=50, description="用户名", example="admin123" ) email: str=Field( ..., min_length=5, max_length=100, description="邮箱", example="admin@test.com" ) phone: str=Field( None, min_length=11, max_length=11, description="手机号", example="13800138000" ) is_admin: bool=Field( False, description="是否是管理员", example=False )

这是添加商品,设置字段的的格式和校验

下面就是添加的请求体 基本都是必填的 也可以为选填

put

@user_router.put("/update/{id}",summary="更新用户") async def update_user(id:int,user: UserCreate): user1= await User.get_or_none(id=id) if not user1: return {"code":0,"message":"用户不存在"} # 1 # if user.username is not None: # user1.username=user.username # if user.email is not None: # user1.email=user.email # if user.phone is not None: # user1.phone=user.phone # if user.is_admin is not None: # user1.is_admin=user.is_admin # await user1.save() # 2 # 只把有值的字段变成字典,排除掉未提供实际值的字段 # user_dict=user.dict(exclude_unset=True) # for key, value in user_dict.items(): # setattr(user1, key, value) # 使用 setattr() 方法动态设置属性 # await user1.save() # 3 user_dict=user.dict(exclude_unset=True) await User.filter(id=id).update(**user_dict) return {"code":1,"message":"修改成功","data":""}

修改内容有三个方法

方法一

user1= await User.get_or_none(id=id) if not user1: return {"code":0,"message":"用户不存在"} # 1 # if user.username is not None: # user1.username=user.username # if user.email is not None: # user1.email=user.email # if user.phone is not None: # user1.phone=user.phone # if user.is_admin is not None: # user1.is_admin=user.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(id=id) if not user1: return {"code":0,"message":"用户不存在"} # 只把有值的字段变成字典,排除掉未提供实际值的字段 user_dict=user.dict(exclude_unset=True) 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_dict=user.dict(exclude_unset=True) await User.filter(id=id).update(**user_dict) return {"code":1,"message":"修改成功"}

这一块是要修改的内容

delete

@user_router.delete("/delete/{id}",summary="删除用户") async def delete_user(id:int): # 1 # user1= await User.get_or_none(id=id) # if user1 is None: # return {"code":0,"message":"用户不存在"} # await user1.delete() # 2 await User.filter(id=id).delete() return {"code":1,"message":"删除成功"}

在task中查找id 然后直接调用方法 delete就可以删除了 前面要加一个await挂载才可以使用

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询