当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django QuerySet.bulk_create用法及代码示例


本文介绍 django.db.models.query.QuerySet.bulk_create 的用法。

声明

bulk_create(objs, batch_size=None, ignore_conflicts=False)

此方法以有效的方式将提供的对象列表插入数据库(通常只有 1 个查询,无论有多少对象),并以列表的形式返回创建的对象,与提供的顺序相同:

>>> objs = Entry.objects.bulk_create([
...     Entry(headline='This is a test'),
...     Entry(headline='This is only a test'),
... ])

不过,这有一些警告:

  • 不会调用模型的save()方法,也不会发送pre_savepost_save信号。

  • 它不适用于multi-table 继承方案中的子模型。

  • 如果模型的主键是 AutoField ,则只能在某些数据库(当前 PostgreSQL、MariaDB 10.5+ 和 SQLite 3.35+)上检索主键属性。在其他数据库上,它不会被设置。

  • 它不适用于多对多关系。

  • 它将objs 转换为一个列表,如果它是一个生成器,它会完全评估objs。强制转换允许检查所有对象,以便可以首先插入具有手动设置主键的任何对象。如果您想批量插入对象而不立即评估整个生成器,则可以使用此技术,只要对象没有任何手动设置的主键:

    from itertools import islice
    
    batch_size = 100
    objs = (Entry(headline='Test %s' % i) for i in range(1000))
    while True:
        batch = list(islice(objs, batch_size))
        if not batch:
            break
        Entry.objects.bulk_create(batch, batch_size)

batch_size 参数控制在单个查询中创建的对象数量。默认是在一批中创建所有对象,除了 SQLite,默认情况下每个查询最多使用 999 个变量。

在支持它的数据库上(除 Oracle 之外的所有数据库),将 ignore_conflicts 参数设置为 True 会告诉数据库忽略插入失败的任何行的失败,例如重复唯一值。启用此参数将禁用在每个模型实例上设置主键(如果数据库通常支持它)。

警告

在 MySQL 和 MariaDB 上,将 ignore_conflicts 参数设置为 True 会将某些类型的错误(重复键除外)变为警告。即使使用严格模式。例如:无效值或不可为空的违规。有关详细信息,请参阅MySQL documentationMariaDB documentation

在 Django 4.0 中更改:

添加了对 SQLite 3.35+ 上获取主键属性的支持。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.query.QuerySet.bulk_create。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。