Insert
SQLAlchemy 的 bulk_insert_mappings 用于高效批量插入字典数据(非 ORM 对象),直接执行 SQL,不触发 ORM 生命周期事件;而 add_all 用于批量添加 ORM 模型实例,会参与 Session 管理、触发事件和进行对象状态跟踪。主要区别在于操作对象类型、是否触发ORM事件及性能。
| 特性 | bulk_insert_mappings(mapper, mappings) | session.add_all(instances) |
|---|---|---|
| 操作对象 | 字典列表 (Mappings) | ORM 模型实例列表 (Instances) |
| 执行方式 | 生成高效的单条 INSERT (批量插入 SQL),通常不刷新 Session | 逐个将对象加入 Session,依赖 session.commit() 触发 INSERT |
| ORM事件 | 不触发 before_insert, after_insert 等 ORM 生命周期事件 | 触发所有相关的 ORM 生命周期事件(如 before_insert) |
| 性能 | 非常快,适合大数据量、仅需数据库层面的插入 | 较慢,但提供完整的 ORM 功能和状态管理 |
| 返回内容 | 无(或只返回主键,取决于数据库/驱动,但通常不管理对象状态) | 对象会被持久化,Session 会跟踪它们的状态 |
| 常用场景 | 数据迁移、大量原始数据快速入库(仅数据库操作) | 创建/更新业务数据,需要利用 ORM 特性(关系、事件、变更追踪) |
简言之: bulk_insert_mappings 是 数据库级别的批量导入,而 add_all 是ORM 级别的批量添加。
批量插入,session.bulk_insert_mappings 性能最高(绕过 ORM 事件),适合超大数据量(10万+);add_all 性能最低但最符合完整 ORM 流程(触发所有事件),适合小批量数据或需要完整生命周期的场景;应根据数据量和需求(是否需要触发ORM事件)选择。
选择指南:
session.bulk_insert_mappings() (最高性能,无ORM事件)
- 适用场景: 海量数据(10万条以上)、纯数据导入、追求极致性能且不需要ORM钩子(如 before_insert)时。
- 优点: 速度最快,因为绕过了 SQLAlchemy 的 ORM 状态管理和事件系统。
- 缺点: 不会触发 MapperEvents(如 before_insert、after_insert)和属性监听器。
session.add_all() (完整ORM,性能最低)
- 适用场景: 小批量数据(1万条以下)、需要完整 ORM 生命周期和事件触发(例如自动生成ID、审计日志等)。
- 优点: 保留完整的 ORM 功能,代码简洁。
- 缺点: 性能相对较低,对于大量数据可能较慢。
总结比较表:
| 特性 | session.bulk_insert_mappings | session.add_all() |
|---|---|---|
| 性能 | 最高 (绕过ORM) | 最低 (完整ORM) |
| ORM事件 | 不触发 | 触发所有 (如 before_insert) |
| 适用数据量 | 10万+ | 小批量 (<1万) |
| 数据格式 | 字典列表 (Mapping) | ORM 模型对象列表 |