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/24 7:57:23 阅读更多 →
树莓派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/23 4:31:36 阅读更多 →
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/23 4:31:51 阅读更多 →

最新新闻

LLaMA大语言模型的工程优化与部署实践

LLaMA大语言模型的工程优化与部署实践

1. 项目概述:为什么LLaMA值得深入研究当我们在讨论现代大语言模型时,Meta开源的LLaMA系列无疑是一个里程碑式的存在。不同于常规的Transformer架构解析,LLaMA在工程实现层面做出了大量创新性设计,这些设计哲学直接影响着模型的推理…

2026/7/24 7:56:38 阅读更多 →
Python生态绘图类库:Plotly、Altair、bqplot、plotlet

Python生态绘图类库:Plotly、Altair、bqplot、plotlet

matplotlib 官网,开源(GitHub,23K Star,8.4K Fork)可视化绘图库, Seaborn 官网,开源(GitHub,14K Star,2.1K Fork)统计数据可视化库&#xff0c…

2026/7/24 7:56:37 阅读更多 →
MiniMax M2.5轻量化模型技术解析与应用实践

MiniMax M2.5轻量化模型技术解析与应用实践

1. MiniMax M2.5模型技术解析MiniMax最新发布的M2.5模型在业内引发广泛讨论,作为一款定位"生产力SOTA"的轻量化模型,其技术实现和实际表现值得深入剖析。从架构设计来看,M2.5采用了混合专家系统(MoE)与量化技术的创新组合&#xff…

2026/7/24 7:56:37 阅读更多 →
基于YOLOv5的高速公路违规行为实时检测系统

基于YOLOv5的高速公路违规行为实时检测系统

## 1. 项目背景与核心价值高速公路违规行为检测一直是交通安全管理的痛点。传统人工监控方式存在效率低、漏检率高的问题,特别是在车流量大、天气条件复杂的情况下。我们团队开发的这套基于深度学习的检测系统,通过YOLOv5目标检测算法与多目标跟踪技术的…

2026/7/24 7:56:37 阅读更多 →
AI职业规划系统:基于ModelEngine与知识库的实践

AI职业规划系统:基于ModelEngine与知识库的实践

1. 项目背景与核心价值去年在帮团队做职业发展咨询时,我发现一个痛点:传统职业规划需要大量人工访谈和资料分析,效率低下且难以标准化。当时就萌生了用AI技术构建智能职业规划工具的想法。经过半年多的实践迭代,终于基于ModelEngi…

2026/7/24 7:56:37 阅读更多 →
AI降噪技术解析:从原理到2026年工具选型指南

AI降噪技术解析:从原理到2026年工具选型指南

1. 项目概述:AI降噪工具的市场需求与技术背景2026年的数字内容创作领域正面临前所未有的音频处理挑战。随着远程会议、播客制作和视频自媒体的爆发式增长,环境噪声干扰已成为影响内容质量的首要问题。传统降噪工具普遍存在三大痛点:过度抑制人…

2026/7/24 7:55:37 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

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

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

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

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/23 17:49:47 阅读更多 →

月新闻