inserting

This module provide utility functions for insert operation.

sqlalchemy_mate.crud.inserting.smart_insert(engine: sqlalchemy.engine.base.Engine, table: sqlalchemy.sql.schema.Table, data: Union[dict, List[dict]], minimal_size: int = 5, _connection: Optional[sqlalchemy.engine.base.Connection] = None, _op_counter: int = 0, _ins_counter: int = 0, _is_first_call: bool = True) Tuple[int, int][source]

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

Returns

number of successful INSERT sql execution; number of inserted rows.

中文文档

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

  1. 尝试Bulk Insert, Bulk Insert由于在结束前不Commit, 所以速度很快。

  2. 如果失败了, 那么对数据的条数开平方根, 进行分包, 然后对每个包重复该逻辑。

  3. 若还是尝试失败, 则继续分包, 当分包的大小小于一定数量时, 则使用逐条插入。

直到成功为止。

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