inserting

This module provide utility functions for insert operation.

sqlalchemy_mate.crud.inserting.smart_insert(engine, table, data, minimal_size=5, op_counter=0)[source]

An optimized Insert strategy. Guarantee successful and highest insertion speed. But ATOMIC WRITE IS NOT ENSURED IF THE PROGRAM IS INTERRUPTED.

中文文档

在Insert中, 如果已经预知不会出现IntegrityError, 那么使用Bulk Insert的速度要 远远快于逐条Insert。而如果无法预知, 那么我们采用如下策略:

  1. 尝试Bulk Insert, Bulk Insert由于在结束前不Commit, 所以速度很快。
  2. 如果失败了, 那么对数据的条数开平方根, 进行分包, 然后对每个包重复该逻辑。
  3. 若还是尝试失败, 则继续分包, 当分包的大小小于一定数量时, 则使用逐条插入。
直到成功为止。

该Insert策略在内存上需要额外的 sqrt(nbytes) 的开销, 跟原数据相比体积很小。 但时间上是各种情况下平均最优的。