学会 SQLAlchemy 搭建 Python 与 MySQL 之间的数据访问桥梁 🚀
新增怎么拿 ID?删除为什么 flush?修改后一定要 refresh 吗? 从单条操作到批量处理,直接看需求、代码和每一步的作用。
先看公共代码:提交、回滚、关闭统一处理,业务里不重复写。
下面的业务代码放在 try 中执行,提交成功后再返回 response。 response 是提前取好的普通数据,db 关闭后也能用。纯查询不需要 commit;flush 失败也要 rollback。
本类总结: 单条用 add,多条用 add_all;提前拿 ID 用 flush,需要重读才用 refresh。最后由公共代码 commit 保存。
流程:创建对象 → 登记新增 → 执行写入 → 按需重读 → 准备返回结果。
流程:先写用户拿 ID → 用 ID 写订单 → 两条记录一起保存。
流程:准备多个对象 → 一次登记 → 执行插入 → 收集 ID。
流程:把表格数据整理成字典 → 批量写入 → 等待统一提交。
流程:创建订单 → 拿订单 ID → 写入商品明细 → 一起保存。
流程:查重 → 新增 → 拿 ID → 准备结果。
用户名还要有数据库唯一约束,防止两人同时注册出同名账号。这里只演示用户数据写入,密码处理另行完成。
本类总结: 按对象删用 db.delete(user),按条件删用 delete(User) 配合 execute。flush 提前执行,commit 最终保存。
软删除:不真正删除记录,只把 is_deleted 这样的字段改为 True,后续查询时要过滤掉它,需要时可改回标记恢复。硬删除:执行 DELETE,提交后删除记录;下面的例子都属于硬删除。
流程:查用户 → 登记删除 → 按需提前执行 → 公共代码提交。
本例删完就结束,通常可以省略 flush,公共代码的 commit 会自动执行删除并提交。保留它只是为了演示:flush 先执行,commit 才确认保存;提交前仍可回滚。
流程:拿到选中的 ID → 限定范围 → 执行删除。
有关联订单等数据时,先确定数据库外键和删除规则;批量删除不执行 ORM 的逐对象关系级联。
本例约定目标不存在也算成功;需要提示不存在时,用前面的 get + delete 写法。
本类总结: 已查出的对象直接改属性,不用再 add;批量修改用 update + where + values 配合 execute。需要重读时先 flush 再 refresh,最后统一 commit。
流程:查用户 → 改属性 → 执行更新 → 按需重读 → 准备结果。
流程:拿到选中的 ID → 筛出待审核账号 → 更新状态。
这种批量更新的 ORM 处理过程与逐个修改对象不同。
流程:取本次字段 → 查用户 → 逐项赋值 → 准备结果。
不用再 add,也不用强行 flush、refresh。 本例直接读取已赋的值,公共代码 commit 时会执行更新。
来源:稀土掘金 原文