簡體   English   中英

Bulk_create 不適用於 batch_size 參數

[英]Bulk_create is not working with batch_size parameter

我正在嘗試使用bulk_create,但它只創建一個對象而不是我規定的batch_size。 我正在為 batch_size 使用一個變量,所以也許這就是問題所在,但我想不出為什么它會成為問題。 這是代碼:

            x = 40 / 2
            if 5 > 4:
                objs1 = 
                 ModelT(
                        name=instance.name,
                        author=instance.author,
                        content=instance.content
                    )

                ModelT.objects.bulk_create(objs1, batch_size=x)

我也試過:

                    ModelT.objects.bulk_create(objs1, x)

也沒有工作。

.bulk_create [Django-doc]將對象列表存儲到數據庫中。 batch_size用於確定每個查詢在數據庫中存儲了多少對象。

例如,如果您有一個包含 100 個元素的列表,並且batch_size=10 ,它將導致 10 個查詢,如果batch_size=25 ,它將導致 4 個查詢(假設查詢不太長)。 或者按照文檔中的說明:

此方法以高效的方式將提供的對象列表插入到數據庫中(通常只有 1 個查詢,無論有多少個對象)。

因此, batch_size參數僅用於“限制”每個查詢存儲的元素數量,對於某些數據庫系統,最好使用多個查詢,例如,在大量插入期間仍然可以訪問該表。

然而,在這里你只給了函數一個元素的列表,所以不管batch_size是多少,你都可以創建一個包含 20 個ModelT的列表:

objs1 = [
    ModelT(name=instance.name, author=instance.author, content=instance.content)
    for _ in range(20)
]

ModelT.objects.bulk_create(objs1)

如果所有對象都具有相同的內容,我們甚至可以乘以一個數字:

objs1 = [
    ModelT(name=instance.name, author=instance.author, content=instance.content)
] * 20

ModelT.objects.bulk_create(objs1)

請注意,如文檔中所述,不會pre_savepost_save信號,並且除非數據庫后端是 PostgreSQL,否則不會設置對象的id (對於后一種方法,這將不起作用,因為我們在這里構造了一個列表有 20 個對同一對象的引用)。

您仍然可以在此處使用上述語義指定batch_size ,但這不會產生功能差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM