用一局太空侵略者看懂 SQLAlchemy ORM:多态继承与 joinedload 预加载实战

发布时间:2026/11/4 1:48:38

用一局太空侵略者看懂 SQLAlchemy ORM:多态继承与 joinedload 预加载实战 用一局太空侵略者看懂 SQLAlchemy ORM多态继承与 joinedload 预加载实战【免费下载链接】sqlalchemyThe Database Toolkit for Python项目地址: https://gitcode.com/gh_mirrors/sq/sqlalchemySQLAlchemy ORM 常被当成 CRUD 脚手架但仓库里藏着一个比较深的例子一个用终端 curses 画出来的太空侵略者游戏运行状态、碰撞判断、动画刷新全部压在 ORM 之上。我们以它为例倒推三件事——如何用一张表装下多种敌人、如何把碰撞检测写成一条 SQL以及为什么一个joinedload能救回一批查询。先跑起来500 行终端射击游戏背后例子在 space_invaders.py 里单文件、无第三方依赖跑起来就是一局可玩的射击游戏。建库和建表只用了四行e create_engine(sqlite://) Base.metadata.create_all(e) session Session(e) init_glyph(session) session.commit()sqlite://是纯内存库create_all一次建完所有表之后对象都挂在同一个Session上。游戏每 10ms 刷新一次而每帧场上有什么都是从数据库查出来的——这正是它作为 ORM 案例的意义所在。单表多态一张 glyph 表装下所有敌人游戏里有军队、UFO、玩家船、导弹、爆炸、提示文字类型很多ORM 却用单表继承把它们塞进同一张glyph表。polymorphic_on 就是类型判别列class Glyph(Base): __tablename__ glyph id Column(Integer, primary_keyTrue) type Column(String) __mapper_args__ {polymorphic_on: type} class ArmyGlyph(EnemyGlyph): __mapper_args__ {polymorphic_identity: army} class GlyphCoordinate(Base): __tablename__ glyph_coordinate glyph_id Column(Integer, ForeignKey(glyph.id)) x Column(Integer) y Column(Integer) glyph relationship(Glyph, innerjoinTrue)polymorphic_on指定type列作判别列polymorphic_identity给每个子类一个字符串标签。查出来时 ORM 按type的值把行还原成正确的子类ArmyGlyph、SaucerGlyph各自带上自己的方法。更多规则见 inheritance.rst。把碰撞检测写进 SQLof_type 与 hybrid_method常规做法是把坐标加载进内存用 Python 逐个判断矩形是否相交。这里反了过来让数据库来做几何判断。intersects 把判断下推到数据库hybrid_method def intersects(self, other): return ~( (self.x self.width other.x) | (self.x other.x other.width) ) ~( (self.y self.height other.y) | (self.y other.y other.height) )hybrid_method让它在 Python 端和 SQL 端都能用于是判负逻辑可以整段下推def check_lose(session, state): player state[player] return ( session.query(GlyphCoordinate) .join(GlyphCoordinate.glyph.of_type(ArmyGlyph)) .filter( GlyphCoordinate.intersects(player) | GlyphCoordinate.bottom_bound ) .count() )of_type(ArmyGlyph)把继承查询收窄到军队这一支再配合intersects生成一条带几何条件的COUNT命中即判负。一次往返没有把全部坐标拉回内存。调优joinedload 如何救你的 N1渲染阶段如果不用预加载每访问一次gcoord.glyph就多发一条查询十几个敌人就是十几条额外往返。joinedload 一次 JOIN 取回关联def draw(session, window, state): for gcoord in session.query(GlyphCoordinate).options( joinedload(GlyphCoordinate.glyph) ): gcoord.render(window, state)joinedload让glyph_coordinate与glyph一次 JOIN 取回把 N1 压回单条 SQL。策略取舍可参考 loading_relationships.rst。对这种小结果集、高频刷新的场景joinedload基本是默认最优解行数极大时再换subqueryload/selectinload。下一步想继续拆可以顺着 space_invaders.py 看move_army如何用func.min/func.max算出军队边界并整体平移或把单表继承换成 joined-table对比多出来的 JOIN。这个例子的价值在于它把多态、hybrid、预加载几件事压缩进了一个能跑、能玩、能看 SQL 的闭环里。【免费下载链接】sqlalchemyThe Database Toolkit for Python项目地址: https://gitcode.com/gh_mirrors/sq/sqlalchemy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/4 2:43:44

K12作业系统为何选择ASP:老旧环境下的稳定交付方案

简介:本资源是一套基于ASPAccess开发的‘网上作业提交系统’教学实践项目,面向K12教育信息化从业者、高校教育技术专业学生及Web初学者,聚焦解决网络课程中作业分发、提交、管理与学习导航等实际问题。系统实现了模块导航、知识点检索导航、知…

2026/11/4 2:43:44

PHPCMS V9 UTF8部署与模板开发实战指南

简介:PHPCMS V9 UTF8是一款面向中初级PHP开发者与网站运维人员的开源内容管理系统,专为构建多语言、高兼容性的企业官网、资讯门户或社区型网站提供开箱即用的解决方案。资源包为完整版安装程序(ZIP格式),大小8.39MB&a…

2026/11/4 2:43:44

ASP+SQL Server进销存系统实战:传统Web应用的事务与状态管理

简介:这是一套基于ASPMSSQL开发的多用户网络进销存管理系统源码,面向中小企业信息化建设者、ASP初学者及仓库管理软件二次开发者,解决传统手工记账效率低、数据分散、权限管控弱等痛点。资源包为RAR格式,大小3.43MB,虽…

2026/11/4 2:43:44

Unity WebGL 中文输入法候选框跟随与全屏兼容实战

简介:该资源面向在 Unity WebGL 项目中需要处理中文输入与输入法定位的开发者,重点解决浏览器环境下中文输入法无法正常唤起、输入框与光标位置错位,以及全屏切换后输入法窗口定位失效等问题,适合具备一定 Unity 与 JavaScript 交…

2026/11/4 2:43:44

Icepak热仿真入门:七步流程与新手避坑指南

简介:这份PDF面向热仿方向初学者与工程技术人员,系统梳理Icepak热流体仿真的完整操作流程,帮助读者建立从建模到结果分析的规范认知。内容围绕七个环节展开:模型建立与CAD导入、边界条件设置、网格划分、求解器选择、物理模型设定…

2026/11/4 2:38:44

实用工具分享,网盘下载

80款受欢迎的软件 https://pan.quark.cn/s/41ef68a54757 Y2A-Auto实用的搬运工具 https://pan.quark.cn/s/0217d14c4ead

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑