首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
用一局太空侵略者看懂 SQLAlchemy ORM:多态继承与 joinedload 预加载实战
📅 2026/11/4 1:48:03
✍️ 爱科研究院
👁 阅读 3,247
用一局太空侵略者看懂 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),仅供参考
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/11/4 1:48:03
对应点齐了,相机位姿还是不对?用 Kornia 把 PnP 算对的最小路径
2026/11/4 1:48:03
Wan2.2-TI2V-5B 本地部署指南:单张 4090,9 分钟出 5 秒 720P 视频
2026/11/4 1:43:02
清华开源VisionReward-Image:多维度评分重构AI视觉生成质量标准
2026/11/4 2:48:09
ASP.NET Core WebAPI 实战:Excel 导入导出接口设计与避坑指南
2026/11/4 2:48:09
基于OpenAPI的JMeter测试脚本自动化生成方案
2026/11/4 2:48:09
SpringDoc与JMeter自动化测试实践
2026/11/4 2:48:09
多智能体协作系统设计与优化实战
2026/11/4 2:48:09
纯静态企业官网前端代码骨架:快速交付与避坑指南
2026/11/4 2:43:09
Thingsboard Gateway 集成 OPC-UA 实战:从模拟到真机配置与避坑指南
2026/11/4 0:02:45
AI辅助技术栈评估:提升研发决策效率60%
2026/11/4 0:02:45
从生成Token到直接决策:Jev如何重塑AI Agent工程实践
2026/11/4 0:02:45
32G统一内存跑大模型:内存账、TPS实测与端云分流
2026/11/3 4:05:41
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/3 4:05:35
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/3 4:05:30
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析
2026/11/3 4:05:41
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/3 4:05:35
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/3 4:05:30
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析