ORM项目搭建
第一部分Tortoise-ORM集成ORM 的概念ORM 全称是 Object-Relational Mapping对象关系映射 。它的核心思想是用 Python 类来代表数据库中的表用类的实例来代表表中的一行记录同步 ORM vs 异步 ORM 对比如代码所示# 同步写法Django ORMuserUser.objects.get(id1)postsPost.objects.filter(authoruser)# 异步写法Tortoise-ORM—— 注意 await 关键字userawaitUser.get(id1)postsawaitPost.filter(authoruser)第二部分环境搭建与 FastAPI 集成基于 MySQL# 安装 Tortoise-ORM 核心库pip install tortoise-orm#MySQL 异步驱动推荐 asyncmypip install asyncmy 或者 pip install aiomysql# 安装 Aerich 迁移工具后面会用到pip install aerich# 安装 FastAPI 和 Uvicornpip install fastapiuvicorn[standard]项目结构规划数据库配置文件app/config.pypythonapp/config.py“”数据库配置文件这个文件定义了 Tortoise-ORM 连接 MySQL 数据库所需的所有配置信息“”TORTOISE_ORM 是 Tortoise-ORM 规定的配置字典变量名后面用 register_tortoise 或 Aerich 时都会引用这个字典TORTOISE_ORM {# 1. 连接配置 —— 定义数据库连接信息“connections”: {# “default” 是默认连接的名字必须有一个 default“default”: {# engine指定数据库后端引擎MySQL 使用 tortoise.backends.mysql“engine”: “tortoise.backends.mysql”,# credentials数据库连接凭证包含主机、端口、用户名、密码等 credentials: { host: 127.0.0.1, # MySQL 服务器地址 port: 3306, # MySQL 端口默认 3306 user: root, # 数据库用户名 password: 123456, # 数据库密码请根据实际情况修改 database: fastapi_db1, # 数据库名称 minsize: 1, # 连接池最小连接数 maxsize: 5, # 连接池最大连接数 charset: utf8mb4, # 字符集支持 emoji echo: True # 是否打印 SQL 语句开发环境建议开启 } } }, # 2. 应用配置 —— 指定模型所在的模块 apps: { # models 是应用的名字可以自定义但 Aerich 需要使用这个名字 models: { # models 列表指定包含 Tortoise 模型类的 Python 模块路径 # aerich.models 是 Aerich 的内置模型用于记录迁移历史必须包含 models: [app.models, aerich.models], # default_connection指定这个应用使用哪个数据库连接 default_connection: default, } }, # 3. 时区配置 use_tz: False, # 是否使用时区 timezone: Asia/Shanghai # 时区设置}FastAPI 主应用app/main.pyfromfastapiimportFastAPI,Query,HTTPExceptionfrompydanticimportField,BaseModelfromstarlette.requestsimportRequestfromstarlette.responsesimportJSONResponsefromtortoiseimportTortoisefromtortoise.contrib.fastapiimportregister_tortoisefromapp.configimportTORTOISE_ORMfromapp.routers.userimportuser_router appFastAPI()register_tortoise(appapp,configTORTOISE_ORM,generate_schemasTrue,add_exception_handlersTrue)第三部分完整项目流程Model模型搭建fromtortoiseimportmodels,fieldsclassUser(models.Model):idfields.BigIntField(pkTrue)usernamefields.CharField(max_length50,verbose_name用户名)passwordfields.CharField(max_length50,verbose_name密码)classMeta:tablet_usertable_description用户表classTask(models.Model):idfields.BigIntField(pkTrue)user_idfields.BigIntField(verbose_name所属用户)titlefields.CharField(max_length50,verbose_name任务标题)descriptionfields.TextField(nullTrue,verbose_name任务描述)statusfields.SmallIntField(default0,verbose_name任务状态)priorityfields.SmallIntField(default1,verbose_name任务优先级)due_datefields.DatetimeField(nullTrue,verbose_name任务截止日期)completed_atfields.DatetimeField(nullTrue,verbose_name完成时间)created_atfields.DatetimeField(auto_now_addTrue)updated_atfields.DatetimeField(auto_nowTrue)classMeta:tablet_tasktable_description任务表查询数据routers:fromdatetimeimportdatetimefromtypingimportListfromfastapiimportAPIRouter,Queryfromapp.models.bookimportUser,Taskfromapp.schemas.bookimportUserLoginRequest,TaskSchema,TaskResponse,TaskList,TaskCreate,TaskUpdate,TaskStatus user_routerAPIRouter(prefix/user,tags[用户])user_router.post(/login,summary登录,description登录)asyncdeflogin(user_login:UserLoginRequest):userawaitUser.filter(usernameuser_login.username).first()ifuserisNone:return{code:0,message:用户不存在}ifuser.password!user_login.password:return{code:0,message:密码错误}return{code:1,message:登陆成功}task_routerAPIRouter(prefix/task,tags[任务])task_router.get(/list,response_modelList[TaskResponse],summary任务列表筛选)asyncdeftask_list(query:TaskListQuery()):infoTask.filter(user_id1)ifquery.statusandquery.status!all:infoinfo.filter(statusint(query.status))ifquery.keyword:infoinfo.filter(title__containsquery.keyword)ifquery.sort_priorityasc:infoinfo.order_by(-priority)else:infoinfo.order_by(priority)returnawaitinfotask_router.post(/add,response_modelTaskResponse,summary新增任务)asyncdeftask_add(data:TaskCreate):taskawaitTask.create(**data.model_dump())returntasktask_router.delete(/delete/{id},summary删除任务,description删除任务)asyncdeftask_delete(id:int):awaitTask.filter(idid).delete()return{code:1,message:删除成功}task_router.put(/update/{id},summary更新用户,description更新用户)asyncdefupdate_task(task:TaskUpdate,id:int):print(dict(task))task1awaitTask.get_or_none(idid)iftask1isNone:return{code:0,message:task not found}task_dicttask.model_dump(exclude_unsetTrue)awaitTask.filter(idid).update(**task_dict)return{code:1,message:update success}task_router.put(/{id}/status/,summary更新任务状态,description快速切换任务状态自动处理完成时间)asyncdefupdate_task_status(body:TaskStatus,id:int):task1awaitTask.get_or_none(idid)iftask1isNone:return{code:0,message:task not found}update_databody.model_dump(exclude_unsetTrue)new_statusupdate_data.get(status)ifnew_status2:update_data[completed_at]datetime.now()else:update_data[completed_at]NoneawaitTask.filter(idid).update(**update_data)return{code:1,message:status update success}schemas:fromdatetimeimportdatetimefromtypingimportListfromfastapiimportAPIRouter,Queryfromapp.models.bookimportUser,Taskfromapp.schemas.bookimportUserLoginRequest,TaskSchema,TaskResponse,TaskList,TaskCreate,TaskUpdate,TaskStatus user_routerAPIRouter(prefix/user,tags[用户])user_router.post(/login,summary登录,description登录)asyncdeflogin(user_login:UserLoginRequest):userawaitUser.filter(usernameuser_login.username).first()ifuserisNone:return{code:0,message:用户不存在}ifuser.password!user_login.password:return{code:0,message:密码错误}return{code:1,message:登陆成功}task_routerAPIRouter(prefix/task,tags[任务])task_router.get(/list,response_modelList[TaskResponse],summary任务列表筛选)asyncdeftask_list(query:TaskListQuery()):infoTask.filter(user_id1)ifquery.statusandquery.status!all:infoinfo.filter(statusint(query.status))ifquery.keyword:infoinfo.filter(title__containsquery.keyword)ifquery.sort_priorityasc:infoinfo.order_by(-priority)else:infoinfo.order_by(priority)returnawaitinfotask_router.post(/add,response_modelTaskResponse,summary新增任务)asyncdeftask_add(data:TaskCreate):taskawaitTask.create(**data.model_dump())returntasktask_router.delete(/delete/{id},summary删除任务,description删除任务)asyncdeftask_delete(id:int):awaitTask.filter(idid).delete()return{code:1,message:删除成功}task_router.put(/update/{id},summary更新用户,description更新用户)asyncdefupdate_task(task:TaskUpdate,id:int):print(dict(task))task1awaitTask.get_or_none(idid)iftask1isNone:return{code:0,message:task not found}task_dicttask.model_dump(exclude_unsetTrue)awaitTask.filter(idid).update(**task_dict)return{code:1,message:update success}task_router.put(/{id}/status/,summary更新任务状态,description快速切换任务状态自动处理完成时间)asyncdefupdate_task_status(body:TaskStatus,id:int):task1awaitTask.get_or_none(idid)iftask1isNone:return{code:0,message:task not found}update_databody.model_dump(exclude_unsetTrue)new_statusupdate_data.get(status)ifnew_status2:update_data[completed_at]datetime.now()else:update_data[completed_at]NoneawaitTask.filter(idid).update(**update_data)return{code:1,message:status update success}这是一个任务表与用户表格的接口效果实现如图下面是用户表的登录接口效果展示下面是任务表格的查询接口展示下面是给任务表格添加数据的效果下面是对任务表格数据修改的展示下面是对任务表格数据删除的展示下面是对任务表格状态的修改的展示以上也就是用orm对数据的增删改查的功能展示他的用法跟django的语法类似

相关新闻

驱动电路维修:ULN2003与L298N故障排查实战

驱动电路维修:ULN2003与L298N故障排查实战

1. 驱动电路维修入门:从菜鸟到能手的必经之路 第一次遇到小信号推不动负载的问题时,我正面对着一台罢工的自动售货机。控制板上的指示灯正常闪烁,但电机纹丝不动。这种"信号有但带不动"的故障,在驱动电路维修中极为常见…

2026/7/20 18:56:03 阅读更多 →
树莓派4B安装Ubuntu Server 20.04 LTS全攻略

树莓派4B安装Ubuntu Server 20.04 LTS全攻略

1. 为什么选择Ubuntu Server 20.04 for Raspberry Pi 当我在2020年第一次尝试将Ubuntu Server 20.04刷入树莓派4B时,完全没想到这个组合会成为嵌入式开发者的黄金标准。与常见的Raspbian(现称Raspberry Pi OS)相比,Ubuntu Server提…

2026/7/20 18:56:03 阅读更多 →
Lens-3.8B-bf16 vs Stable Diffusion:Apple Silicon上的终极性能对比测试

Lens-3.8B-bf16 vs Stable Diffusion:Apple Silicon上的终极性能对比测试

Lens-3.8B-bf16 vs Stable Diffusion:Apple Silicon上的终极性能对比测试 【免费下载链接】Lens-3.8B-bf16 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Lens-3.8B-bf16 在Apple Silicon平台上选择合适的大语言模型进行文本到图像生成时&am…

2026/7/20 18:56:03 阅读更多 →

最新新闻

大型网站架构演化:从单机到分布式系统的技术路径

大型网站架构演化:从单机到分布式系统的技术路径

1. 大型网站架构演化的必然性2003年,淘宝网刚刚成立时,整个系统跑在一台服务器上,用的是PHPMySQL的简单架构。而到了2023年双11,淘宝系统峰值交易量达到每秒58.3万笔。这种规模的增长不是一蹴而就的,而是经历了20年持续…

2026/7/22 2:10:38 阅读更多 →
Microsoft服务器端口配置与安全管理指南

Microsoft服务器端口配置与安全管理指南

1. Microsoft服务器端口全景图在企业IT基础设施中,Microsoft服务器产品构成了核心业务支撑平台。这些服务通过特定网络端口进行通信,了解这些端口配置对于系统管理员而言至关重要。想象一下,当你需要排查Exchange邮件服务故障或Active Direct…

2026/7/22 2:10:38 阅读更多 →
CocosCreator UI框架:5种窗体类型让你的游戏界面管理更轻松

CocosCreator UI框架:5种窗体类型让你的游戏界面管理更轻松

CocosCreator UI框架:5种窗体类型让你的游戏界面管理更轻松 【免费下载链接】CocosCreator_UIFrameWork 基于CocosCreator的轻量框架, 主要是针对单场景的游戏管理, 将界面制作成预制体, 提供了对界面预制体的显示, 隐藏, 释放等功能, 游戏管理更简单! 项目地址: …

2026/7/22 2:10:38 阅读更多 →
JavaScript定时器原理与最佳实践指南

JavaScript定时器原理与最佳实践指南

1. JavaScript定时器基础与清除机制解析在Web开发中,定时器是实现延迟执行和周期性任务的核心工具。作为前端开发者,我们几乎每天都会与setTimeout和setInterval这两个函数打交道。但你真的了解它们的运作机制吗?特别是当我们需要取消这些定时…

2026/7/22 2:10:38 阅读更多 →
RabbitMQ队列内存管理机制与优化实践

RabbitMQ队列内存管理机制与优化实践

1. AMQP 0-9-1队列内存动态变化原理剖析RabbitMQ作为AMQP 0-9-1协议最流行的实现,其队列内存管理机制一直是开发者关注的焦点。在实际生产环境中,我们经常会观察到队列内存随着消息发布/消费呈现周期性波动现象。这种现象背后涉及AMQP协议设计哲学、Erla…

2026/7/22 2:10:38 阅读更多 →
BiliTools完整教程:跨平台免费下载B站视频的终极解决方案

BiliTools完整教程:跨平台免费下载B站视频的终极解决方案

BiliTools完整教程:跨平台免费下载B站视频的终极解决方案 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 想要将喜欢的B站视频保存到本地吗?BiliTools就是你需要的答案&#xff…

2026/7/22 2:09:38 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻