Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Insert

bulk_insert_mappings vs add_all

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 模型对象列表