2026-05-21 学习记录 —— SQLAlchemy、SQLModel、CQRS 骨架搭建
2026-05-21 学习记录 🎯 SQLAlchemy Core 硬啃官方文档、SQLModel 增删改查一对多多对多全过了一遍、CQRS 极简电商订单系统骨架搭建、分布式 ID 雪花算法、以及 FastAPI 作者原来是搞音乐的。 —— 塑梦 SQLAlchemy Core(官方文档硬啃)第一遍完全看不懂,硬着头皮啃完发现其实就是用 Python 对象描述数据库: MetaData:装表的箱子 Table:数据库表在 Python 里的替身 Column:列 ORM 模型(class User(Base))底层自动生成这些东西 Core vs ORM: Core ORM SQL 表达式语言 操作 Python 对象 engine.connect() 直接说话 Session 雇秘书帮你管对象 engine.begin() 自动事务 engine.connect() 需手动 commit 第一次看官方文档看不懂太™正常了。 SQLModel 深入学习基础 CRUD table=True = 数据库表,不写 = 纯...
Python 协程(下)——从事件循环到协程调试
本文是协程系列的收尾篇。看完你能回答: 事件循环底层怎么工作的? asyncio.Queue / Semaphore / wait_for 怎么用? 协程之间共享数据要加锁吗? 协程怎么调试? 一、事件循环内部1.1 事件循环 = 调度器事件循环本质上就是一个 while True: 123456789# 伪代码——事件循环就这么简单def event_loop(tasks): ready = tasks # 就绪队列 while ready: for task in ready: if task.can_run(): task.step() # 执行一步,直到遇到 await if task.done(): ready.remove(task) 每次遇到 await,协程挂起,控制权回到事件循环。事件循环去跑别的 Task,等这个协程等待的条件满足了再把它加回就绪队列。 1.2 await...
Python 事件驱动架构——从 EventBus 到代理拓扑
本文完整代码:github.com/SumengQAQ/pythonic-design-patterns 一、故事:从一把锁开始想象你开了一个社区网站。用户注册后需要: 发一封欢迎邮件(耗时 2 秒) 发一张新人优惠券(耗时 1 秒) 记录注册行为到分析系统(耗时 0.5 秒) 最粗暴的写法: 12345def register_user(name, email): save_to_db(name, email) send_email(name, email) issue_coupon(name) track_analytics(name) 一个注册请求卡 3.5 秒——用户等得想摔键盘。 二、第一次进化:异步 + 并发用协程让三个操作同时跑: 1234567async def register_user(name, email): user = await save_to_db(name, email) await asyncio.gather( send_email(user), ...
Python 协程(上)——从 async/await 到并发控制
本文带大家用自顶向下的方式理解 Python 协程。看完你能回答这三个问题: async def 和 await 到底是什么? create_task 和直接 await 有什么区别? 怎么让三个任务同时跑、哪个先好就先处理哪个? 一、为什么需要协程?想象你在厨房里做饭: 同步(一个人做饭):红烧肉焯水的时候你干等着,水开了才去切菜 多线程(请了三个厨师):三个厨师各做各的,但厨房太小容易撞在一起,还要协调谁用哪个灶 协程(一个厨师 + 眼观六路):红烧肉焯水的时候你去切菜,水开了回来处理——一个人把所有事安排得明明白白 协程的核心理念就是:在等待 I/O 的时候去做别的事。 二、基础语法2.1 async def 和 await12345678import asyncioasync def say_greeting(name: str, delay: int): print(f"{name} 说:先等 {delay} 秒...") await asyncio.sleep(delay)...
用 Python 写一个微内核架构——从 __init_subclass__ 到插件生命周期
本文适合有 Python 基础、想了解架构设计、但不知道”微内核”在代码里长什么样的读者。代码仓库:github.com/SumengQAQ/pythonic-design-patterns 一、微内核是什么?先讲个故事。 你用 VS Code 写代码。VS Code 本身只提供编辑器窗口和几个菜单项。安装 Python 插件后,代码高亮了、能调试了。装 Git 插件后,侧边栏多了源代码管理。装 Live Share 插件后,你能跟朋友实时协作。 VS Code 本身很小,功能全是插件给的。 这就是微内核模式——一个极小的核心系统 + 一堆可插拔的插件。核心只做两件事: 管好插件(加载、注册、卸载) 提供插件之间通信的渠道 至于”格式化代码”、”语法高亮”、”调试”……这些都是插件的事,内核不管。 二、我们要做什么作为一篇教程,总得有个看得见摸得着的目标。 我选了一个足够简单又足够说明问题的场景:模拟 IDE 的右键菜单。 当你右键点击一个文件时,不同插件会往菜单里添加不同选项: 123右键点击文件 → 菜单弹出 ├─...
2026-05-11 学习记录 —— 修 typo、推代码、学内存、被虚函数表绕晕
2026-05-11 学习记录 🎯 今天的内容分三块:修 typo 推代码、学内存管理、被虚函数表绕晕了。以及——那个 hard 题我最后还是没写 (´・ω・`) —— 塑梦 🏗️ 下午:批量修 typo + 推代码 塑梦:我把代码架构也写完了,你看看,然后commit再push一下? 早上一打开,塑梦说座位预约系统的 Python 骨架写完了。10 个文件,从 model.py 到 service.py 到 exception.py,整整齐齐。 然后我读了一遍—— 虚幻:……嗯?这个 adds_score 和 redces_score 是不是拼错了?还有 studet_id——Studet 这个词这已经是第三次出现了哦 (´・ω・`) 塑梦:啊啊啊我修了!好丢人orz 于是批量修了三个 typo,顺手把 Timer 精简了一下(去掉了你之前说不需要的 can_continue 和 interrupt_trigger),类图也同步更新了。然后推上去了——用的树形结构 commit message。 📝 Git 小插曲 塑梦:哦哦哦,但是我如果想修改这个已经p...
2026-05-10 学习记录 —— 从操作系统到Hexo,从类图到信号量
2026-05-10 学习记录 🎯 今天从操作系统一直折腾到 Hexo 博客,中午画完了自习室系统的类图,晚上以信号量 PV 操作收尾。墙上时钟走过零点的时候,我终于把这份笔记从 Obsidian 搬到了 Hexo 上——这是博客的第一篇文章。 —— 塑梦 一、上午:自习室系统类图收尾类图画了快一周,今天终于把最后的部分补完了。 异常继承体系之前一直在纠结”哪些情况该抛异常、哪些该正常返回”。最后想清楚了——业务分支不抛异常,系统故障才抛异常。 12用户信用分不足 → 正常返回"信用分不够",不抛异常数据库连不上 → 抛出 DatabaseConnectionError,记录日志 于是画了两个异常基类: 12345678910111213DomainError├── InvalidReservationStateError├── InvalidSeatStateError└── ReputationScoreOutOfRangeErrorInfrastructureError├── DatabaseConnectionError├── Persiste...