当前位置: 首页 > article >正文

python tortoise-orm

# Python Pony一个被低估的ORM其实比你想的更好用说到Python的ORM大部分人第一个想到的是SQLAlchemy其次是Django ORM。如果你去问十个Python开发者可能有七八个会提到这两个。Pony ORM也许有人听说过但真正用过的不会太多。这有点可惜因为Pony在某些场景下其实比那些“大牌”更好用。它到底是什么东西Pony ORM是一个Python的关系对象映射库简单说就是把数据库的表结构映射成Python的类让开发者用Python对象的方式操作数据库而不是写一堆SQL字符串。但它跟其他ORM有个挺大的区别——它用一种叫“实体关系图”的方式描述数据库结构代码写起来更像是在画一张ER图。举个例子如果你用SQLAlchemy定义一个用户表大概是这样classUser(Base):__tablename__usersidColumn(Integer,primary_keyTrue)nameColumn(String)而Pony的写法是classUser(db.Entity):idPrimaryKey(int,autoTrue)nameRequired(str)看着差别不大但如果你定义有外键关联的表区别就出来了。Pony允许你在两个实体之间直接写关联属性像这样classUser(db.Entity):idPrimaryKey(int,autoTrue)nameRequired(str)postsSet(Post)classPost(db.Entity):idPrimaryKey(int,autoTrue)titleRequired(str)authorRequired(User)这其实就是在画ER图——用户和帖子之间是一对多关系用户有帖子集合帖子属于某个用户。Pony会自动处理外键你不用手动定义那个外键字段。它能解决什么实际问题1. 查询语法极其自然这是Pony最大的亮点。它的查询语法很像Python的列表推导式读起来基本就是自然语言。比如你要查所有标题包含“Python”并且发布时间在一周内的帖子用Pony写select(pforpinPostifPythoninp.titleandp.pub_dateweek_ago)对比SQLAlchemysession.query(Post).filter(Post.title.contains(Python),Post.pub_dateweek_ago)Pony的写法几乎和你在纸上画的条件筛选一模一样。如果你需要按作者名排序再加一个order_by子句它依然保持这种“说人话”的风格。2. 懒加载与急加载的自动管理很多ORM在懒加载上面做得不够聪明。比如你加载一个用户列表然后循环中访问每个用户的posts如果默认是懒加载就会产生N1查询问题如果急加载又可能加载了你根本用不上的数据。Pony在这里有个挺聪明的处理方式。它会在单个查询上下文中延迟加载但如果你在循环中访问关联数据它会自动意识到你可能需要所有数据只发一次额外查询。这点是我实际使用中觉得最舒服的地方不用刻意去调优加载策略。3. 数据库迁移不需要额外工具Django有migrationsSQLAlchemy有Alembic。Pony的做法比较特别——它会在启动时自动检测实体定义和数据库实际结构之间的差异然后自动执行ALTER TABLE。当然你可以关掉这个功能但对于开发阶段来说这真的很方便。改完模型定义重启应用表结构就同步了。生产环境你可能想手动控制但开发迭代时少了个需要操心的事情。怎么上手用起来安装就是一条命令pipinstallpony然后你需要连接数据库、定义实体、操作数据。一个完整的最小例子frompony.ormimport*# 创建数据库对象dbDatabase()# 定义实体classUser(db.Entity):idPrimaryKey(int,autoTrue)nameRequired(str,uniqueTrue)ageOptional(int)postsSet(Post)classPost(db.Entity):idPrimaryKey(int,autoTrue)titleRequired(str)contentRequired(str)authorRequired(User)# 绑定数据库db.bind(providersqlite,filename:memory:)# 生成表结构db.generate_mapping(create_tablesTrue)# 操作数据注意db_session上下文db_sessiondefadd_user_and_posts():userUser(name张三,age25)Post(title第一篇文章,content这是内容,authoruser)Post(title第二篇文章,content这也是内容,authoruser)db_sessiondefquery_posts():postsselect(pforpinPostifp.author.name张三)forpostinposts:print(post.title,post.content)注意到db_session了吗这是Pony的上下文管理器所有数据库操作必须在这个装饰器或上下文内进行。它负责管理事务、连接池和缓存。如果你忘记用这个装饰器Pony会报错提醒得很及时。一些值得注意的实践1. 把db_session放在视图层或业务层入口不要在单个函数内部使用多个db_session尽量让一个请求或一个任务共享一个session。Pony的session带有一个一级缓存同一个实体对象在一次session内只加载一次多次访问同一个记录不会重复查询数据库。如果你一个请求内切分了多个session这个缓存效果就没了。2. 处理大数据量时注意使用切片Pony的查询返回的是一个查询对象不是列表。当你遍历它时它实际上是一边迭代一边从数据库取数据类似于生成器。但如果你需要取全部数据然后做随机访问最好显式做切片resultselect(pforpinPost)[:100]这样只取前100条而不是把所有记录加载到内存。3. 复杂关联查询时的陷阱Pony的关联查询写起来很自然但某些情况下可能生成不够优化的SQL。比如你需要跨多个表做聚合查询它的查询计划器有时候会生成子查询而非JOIN。这种情况不常见但如果你发现查询响应慢了建议打开Pony的日志功能看看它实际生成的SQL是什么set_sql_debug(True)这条语句会打印所有执行的SQL调试性能问题时特别有用。跟其他ORM比怎么样vs SQLAlchemySQLAlchemy是那种什么都能干的全能型选手支持几十种数据库有成熟的事件系统、自定义类型、声明式扩展。Pony在这些方面差很多——它支持的数据库只有常用的几种SQLite, PostgreSQL, MySQL, Oracle, CockroachDB扩展性也不如SQLAlchemy。但Pony在查询可读性和易用性上明显胜出。SQLAlchemy的查询语法虽然强大但写多了会发现它越来越接近SQL而不是Python。Pony保持了纯Python风格的查询代码审查时更容易理解业务逻辑。还有一个差异是Pony允许在实体定义中直接写约束条件比如classUser(db.Entity):nameRequired(str,uniqueTrue)ageRequired(int,min0,max150)这种字段级别的验证在Pony里是内置的写入数据时会自动校验不用额外写表单验证。vs Django ORMDjango ORM是为Django框架定身的和框架本身深度绑定。如果你不是用Django基本没法用它的ORM当然也可以硬拆出来但很麻烦。Pony是独立的库Flask、Tornado、FastAPI都可以用。Django ORM在复杂查询方面比较弱比如嵌套子查询、窗口函数这些支持得不好。Pony在这方面虽然不如SQLAlchemy但比Django ORM好不少。不过Django ORM有一个东西是Pony没有的——QuerySet的链式调用和延迟执行。Pony的查询一旦被迭代数据就取出来了不能像Django那样一直链式调用filter、exclude最后才求值。vs Tortoise ORMTortoise是异步原生的ORM专为asyncio设计。Pony是同步的虽然它也有异步尝试但目前还不成熟。如果你写的是异步Web框架比如FastAPI或QuartTortoise可能会更顺滑。Pony在异步场景下需要自己维护线程池不太优雅。说句实在话Pony不是那种“一招鲜”的ORM它有明显的短处——支持数据库少、社区规模小、没有成熟的迁移管理工具、异步支持不完善。但如果你在做一个中等规模的项目团队里Python水平参差不齐Pony的# # 深入聊聊 Python 里的 Tortoise-ORM之前有个朋友问我他写了个异步的 Web 服务想找个好用的 ORM但又不想碰那些重量级的东西。我当时就想到了 Tortoise-ORM。这个库说实话在 Python 的 ORM 生态里不算最出名的那一批但用下来你会发现它在某些场景下真的很顺手。它到底是什么Tortoise-ORM 是一个异步的 ORM 框架专门为 Python 的 asyncio 生态设计的。你可能用过 SQLAlchemy但那个主要是同步的虽然在 async 方面做了很多工作但总觉得有点 “后天改造” 的味道。Tortoise-ORM 从出生就是异步的底层的数据库连接全部走 async/await 这套。它借鉴了很多 Django ORM 的设计思路。比如模型的声明方式、查询的 API如果你写过 Django上手 Tortoise-ORM 会感觉特别亲切。但又有自己的特色比如它支持数据库迁移、内置了 Aerich 这个迁移工具、还支持多种数据库后端。不过有一点要注意它不像 SQLAlchemy 那样可以处理特别复杂的 SQL 查询。它的定位是够用就好在常见场景下让你写得快、跑得快。能帮我们解决什么问题最直观的是如果你在写 FastAPI、Sanic、Quart 这类异步框架Tortoise-ORM 能让你避免线程切换带来的麻烦。同步 ORM 在异步环境下用起来总是要小心各种阻塞绕来绕去。它的模型定义方式让数据表关系变得很容易管理。比如你有用户和文章用户能发表多篇文章用 ForeignKeyField 一申明就行。查用户的所有文章就是一个 await user.articles.all() 的事。这种链式查询在写业务逻辑时特别自然。还有一个很实用的是它内置了 Pydantic 模型生成功能。你可以直接从 Tortoise 模型生成 Pydantic 模型用于 API 的请求校验和响应序列化。省去了很多手动写序列化器的时间。实际用起来感觉怎么样拿一个简单的博客系统举个例子。先定义模型fromtortoiseimportModel,fieldsclassUser(Model):idfields.IntField(pkTrue)usernamefields.CharField(max_length32,uniqueTrue)emailfields.CharField(max_length128)articlesfields.ReverseRelation[Article]classArticle(Model):idfields.IntField(pkTrue)titlefields.CharField(max_length255)contentfields.TextField()authorfields.ForeignKeyField(models.User,related_namearticles)created_atfields.DatetimeField(auto_now_addTrue)这里有几个有意思的设计。ForeignKeyField 里的 “models.User” 这种字符串引用方式在模型有循环依赖时特别有用。related_name 让你可以反过来从用户查文章。初始化数据库连接一般在应用启动时做fromtortoiseimportTortoiseasyncdefinit_db():awaitTortoise.init(db_urlsqlite://db.sqlite3,modules{models:[path.to.models]})# 生成表结构开发环境用awaitTortoise.generate_schemas()查询的写法很直观。比如获取最近的 10 篇文章同时预加载作者信息articlesawaitArticle.all().select_related(author).order_by(-created_at).limit(10)这里 select_related 的作用是减少数据库查询次数避免 N1 问题。Tortoise 还提供了 prefetch_related在查询多对多关系时很有用。一些实践中总结的经验用 Tortoise-ORM 一段时间后我总结了几点值得注意的地方。事务的处理需要小心。Tortoise 的事务是基于连接隔离的你要确保事务内的所有操作都用同一个数据库连接asyncwithin_transaction()asconn:userawaitUser.create(usernametest,using_dbconn)articleawaitArticle.create(titletest,authoruser,using_dbconn)还有一个坑是关于延迟加载的。如果你在循环里用 await 去取关联数据可能会产生很多次数据库查询。比如这样articlesawaitArticle.all()forarticleinarticles:authorawaitarticle.author# 每次循环都查一次数据库更好的做法是用 select_related 或者 prefetch_related 一次性查出来。在数据模型的设计上建议把业务逻辑放在模型的方法里。比如用户注册时密码的处理可以写一个类方法classUser(Model):# ... 字段定义 ...classmethodasyncdefregister(cls,username:str,password:str)-User:hashedhash_password(password)# 假设有个hash函数returnawaitcls.create(usernameusername,password_hashhashed)这样调用方只需要 User.register(username, password)里面怎么存密码是模型自己的事。和其他 ORM 的比较和 SQLAlchemy 相比Tortoise-ORM 在异步支持上更原生。SQLAlchemy 虽然有 async 模式但用起来总觉得有层隔膜。不过如果你的查询特别复杂需要各种子查询、CTE、窗口函数SQLAlchemy 会更有优势。和 Django ORM 相比Tortoise-ORM 轻量化很多。Django ORM 绑定在 Django 框架里而 Tortoise 可以独立使用。但 Django ORM 的生态更加成熟文档更全遇到的坑也基本都有前人的解决方案。和 GINO 相比GINO 更简洁但功能偏少。Tortoise-ORM 在模型关联、迁移支持上做得更好。不过如果你只需要非常基础的数据库操作GINO 的学习成本更低。总的来说Tortoise-ORM 特别适合中小型项目尤其是那些基于 asyncio 的 Web 服务。它让你在很多常见场景下写得很舒服对于不常见的复杂需求你也可以通过执行原生 SQL 来兜底。毕竟OR 映射层再强大底层还是 SQL。简单和直观反而能让新人快速上手。特别是那些写业务逻辑的同事他们不用深入了解ORM的内部机制就能写出可读性很强的查询。我个人觉得Pony最合适的场景是快速原型开发和中小型内部系统。大型系统或者对性能有极端要求的地方还是让SQLAlchemy上场吧。但如果你厌倦了反复调整query、写一堆lambda表达式、调试懒加载问题不妨试试Pony它的查询写起来真的很舒服。

相关文章:

python tortoise-orm

# Python Pony:一个被低估的ORM,其实比你想的更好用 说到Python的ORM,大部分人第一个想到的是SQLAlchemy,其次是Django ORM。如果你去问十个Python开发者,可能有七八个会提到这两个。Pony ORM?也许有人听说…...

MacType:让你的Windows字体焕然一新

MacType:让你的Windows字体焕然一新 【免费下载链接】mactype Better font rendering for Windows. 项目地址: https://gitcode.com/gh_mirrors/ma/mactype 还在为Windows系统模糊的字体显示而烦恼吗?MacType是一款强大的开源字体渲染增强工具&am…...

python pony

# Python Pony:一个被低估的ORM,其实比你想的更好用 说到Python的ORM,大部分人第一个想到的是SQLAlchemy,其次是Django ORM。如果你去问十个Python开发者,可能有七八个会提到这两个。Pony ORM?也许有人听说…...

对比直接使用厂商 API 与通过 Taotoken 调用的成本透明度差异

对比直接使用厂商 API 与通过 Taotoken 调用的成本透明度差异 1. 多厂商 API 账单管理的挑战 当个人开发者直接对接多个大模型厂商时,成本管理往往面临显著挑战。每个厂商通常提供独立的控制台和账单系统,开发者需要分别登录不同平台查看使用情况。这种…...

在自动化测试流程中集成 Taotoken 实现智能断言生成

在自动化测试流程中集成 Taotoken 实现智能断言生成 1. 自动化测试中的断言生成挑战 编写和维护自动化测试脚本是测试工程师日常工作的重要组成部分。其中,断言语句的生成与校验往往需要大量人工介入,尤其是在处理复杂业务逻辑或动态数据时。传统方式下…...

如何快速掌握TouchGal:从零开始的完整Galgame社区实战指南

如何快速掌握TouchGal:从零开始的完整Galgame社区实战指南 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next TouchGal是一个…...

利用 Taotoken 实现多模型 API 密钥的统一管理与访问控制

利用 Taotoken 实现多模型 API 密钥的统一管理与访问控制 1. 多模型密钥管理的核心挑战 在中大型项目或企业环境中,不同团队或项目往往需要访问不同的大模型能力。传统模式下,每个团队单独管理自己的 API 密钥会导致以下问题:密钥分散难以追…...

在Nodejs后端服务中集成Taotoken实现异步AI对话功能

在Nodejs后端服务中集成Taotoken实现异步AI对话功能 1. 项目初始化与环境配置 在Node.js后端项目中集成Taotoken的第一步是安装必要的依赖包。使用npm或yarn安装官方OpenAI JavaScript SDK,该SDK兼容Taotoken的API接口规范: npm install openai建议将…...

从零掌握提示工程:系统化学习与AI高效对话的核心技艺

1. 项目概述:从零到一,掌握与AI对话的核心技艺最近几年,AI对话模型的能力突飞猛进,从简单的问答到复杂的创作、编程、分析,几乎无所不能。但你是否也有过这样的困惑:面对同一个AI,别人能轻松让它…...

机器人记忆与策略理解:关键技术突破与应用实践

1. 项目背景与核心挑战在机器人智能化发展的进程中,记忆能力和策略理解一直是制约其实际应用的两大瓶颈。我们团队最近完成的"机器人记忆基准测试与通用策略理解"项目,正是针对这两个关键问题展开的系统性研究。记忆能力决定了机器人能否有效积…...

PvZWidescreen技术解析:用Rust重绘经典游戏的宽屏体验

PvZWidescreen技术解析:用Rust重绘经典游戏的宽屏体验 【免费下载链接】PvZWidescreen Widescreen mod for Plants vs Zombies 项目地址: https://gitcode.com/gh_mirrors/pv/PvZWidescreen 你是否曾在现代宽屏显示器上重温《植物大战僵尸》时,被…...

基于AI智能体的加密市场叙事分析与趋势追踪系统构建

1. 项目概述:一个能自主思考的加密市场情报员 最近在SURGE OpenClaw的黑客松里,我和团队捣鼓出了一个挺有意思的东西,我们叫它 MoltTrend Claw 。简单来说,它是一个能自己“看”市场、自己“想”问题、自己“写”报告的加密市…...

B站视频下载终极指南:3步搞定无水印高清视频下载

B站视频下载终极指南:3步搞定无水印高清视频下载 【免费下载链接】BiliDownload B站视频下载工具 项目地址: https://gitcode.com/gh_mirrors/bil/BiliDownload BiliDownload是一款基于Java开发的专业B站视频下载工具,通过调用B站WEB端和TV端API实…...

用Python复现地震波走时计算:从SPM到SPFSM,手把手教你实现射线追踪(附完整代码)

Python实现地震波走时计算:从SPM到SPFSM的算法演进与代码实战 地震波走时计算是地球物理勘探中的基础问题,无论是油气资源勘探还是地下结构成像,都需要精确计算地震波从震源到接收点的传播时间。传统的最短路径法(SPM)…...

Kafka 事务机制 跨分区 + 跨会话 通俗讲解 + 可运行代码示例

Kafka 事务机制 跨分区 跨会话 通俗讲解 可运行代码示例 一、先白话定义 1. 跨分区写入 一次业务,需要往多个分区 / 多个主题发送多条消息。 事务保证:多条消息要么全部提交消费者可见,要么全部回滚一条都看不见,不会中间成功一…...

终极RPG Maker MV/MZ插件集合:500+免费插件打造专业级游戏开发体验

终极RPG Maker MV/MZ插件集合:500免费插件打造专业级游戏开发体验 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV 你是否曾为RPG Maker有限的游戏机制而苦恼&#xff1f…...

LRCGET:离线音乐库批量歌词下载与同步的智能解决方案

LRCGET:离线音乐库批量歌词下载与同步的智能解决方案 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否曾为海量离线音乐文件寻找同步歌…...

突破网盘下载限制:智能直链解析工具助你告别龟速下载

突破网盘下载限制:智能直链解析工具助你告别龟速下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...

一文读懂 Graphify 知识图谱

Graphify 是一款开源、本地优先的多模态知识图谱构建工具,主打 “一条命令把任意文件夹(代码 / 文档 / 图片 / PDF 等)转成可查询、持久化的知识图谱”,2026 年 4 月由开发者 Safi Shamsi 发布,短时间内获得高人气。它…...

分布式水文模型学习进展

swat模型及分布式水文模型使用与开发简介问题记录简介 这是swat及其他分布式水文模型的使用及开发过程中遇到的问题及解决方法的记录,目前仅为暂时的、非完整、非体系化的记录,待日后完善。 问题记录 什么都对但结果数量级不对 : 分几种情…...

创业公司如何利用 Taotoken 管理多个 AI 模型的调用成本

创业公司如何利用 Taotoken 管理多个 AI 模型的调用成本 1. 多模型统一接入的价值 对于资源有限的创业团队而言,产品开发过程中往往需要尝试多种大模型能力。传统方式需要为每个供应商单独注册账号、管理多个 API Key,不仅增加运维负担,也难…...

PCIe 5.0测试入门:手把手教你用示波器和VNA完成发射机(Tx)与接收机(Rx)一致性测试

PCIe 5.0测试实战指南:从设备校准到信号分析的完整流程 实验室的灯光下,一台搭载PCIe 5.0接口的显卡正在测试台上静静等待验证。32GT/s的数据传输速率对硬件设计提出了前所未有的挑战,而精确的测试流程则是确保产品可靠性的关键防线。本文将带…...

告别龟速!手把手教你将Jetson Xavier NX系统迁移到NVMe固态硬盘(附rootOnNVMe脚本详解)

Jetson Xavier NX系统迁移至NVMe固态硬盘实战指南 1. 为什么需要将系统迁移到NVMe固态硬盘? Jetson Xavier NX作为NVIDIA推出的边缘计算设备,默认配置的EMMC存储虽然稳定,但在实际AI应用场景中往往成为性能瓶颈。当运行计算机视觉模型或处理高…...

鸣潮自动化工具OK-WW:解放双手的智能后台战斗完整指南

鸣潮自动化工具OK-WW:解放双手的智能后台战斗完整指南 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 《鸣潮》&#x…...

go语言使用互斥锁进行同步

我们可以利用互斥锁来保护代码中的关键部分,从而确保每次只能有一个goroutine访问共享资源。这样一来,就能避免竞争条件的问题。几乎所有支持并发编程的语言中,都使用了类似互斥锁的机制。在本章中,我们首先会了解互斥锁的功能。之…...

Windows 笔记本低功耗优化指南:从系统配置到 BIOS 底层,根治关机跑电

三步根治关机掉电快、合盖耗电异常,从系统到 BIOS 彻底解决!很多 Windows 11 笔记本用户都遇到过这种情况:明明正常关机,第二天开机电池掉电 10%;合盖放包里,半天就掉电 20%,甚至直接关机。这种…...

使用 Python 快速接入 Taotoken 并调用多模型 API 的完整步骤

使用 Python 快速接入 Taotoken 并调用多模型 API 的完整步骤 1. 准备工作 在开始编写代码之前,您需要完成几个简单的准备工作。首先确保您拥有一个 Taotoken 账户,并在控制台中创建了 API Key。登录 Taotoken 平台后,可以在「API 密钥管理…...

为什么你的网盘下载总是卡在“蜗牛模式“?LinkSwift用JavaScript重新定义文件下载体验

为什么你的网盘下载总是卡在"蜗牛模式"?LinkSwift用JavaScript重新定义文件下载体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度…...

秒言输入法 | 毫秒级极速响应 懂你的AI语音输入法

链接:https://pan.quark.cn/s/88b1a0f87060依靠强大的 AI 模型,秒言能自动整理口语中的碎片化语言,修正语病,输出你真正想表达的文字。...

Chrome二维码插件:3分钟掌握跨设备分享的终极指南

Chrome二维码插件:3分钟掌握跨设备分享的终极指南 【免费下载链接】chrome-qrcode :zap: A Chrome plugin to Genrate QRCode of URL / Text, or Decode the QRcode in website. 一个Chrome浏览器插件,用于生成当前URL或者选中内容的二维码,同…...