當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。