簡體   English   中英

緩慢保存到Django數據庫

[英]Slow saving to Django database

我創建了一個自定義的manage.py命令,如下所示:

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
from photos.models import Person


class Command(BaseCommand):
    help = 'Pre-populate database with initial data'

    def _create_people(self, user):
        for i in range(0, 100):
            person = Person(first_name='FN', surname='SN', added_by=user)
            person.save()

    def handle(self, *args, **options):
        user = User.objects.get(username="user1")
        self._create_people(user)

我計時的handle()執行,大約需要0.02秒,如果我不這樣做person.save()和大約每0.1秒Person ,如果我不救。 數據庫是sqlite,我相信它應該更快。 有什么可以解釋如此糟糕的表現,我該如何改善呢?

分析:

def _create_people(self, user):
   for i in range(0, 100):
     person = Person(first_name='FN', surname='SN', added_by=user)
     # Hits the database for each save.
     person.save()

此功能將命中數據庫100次並每次自動提交,這就是導致性能低下的原因(不考慮sqlite與MySQL或PostgreSQL相比性能低下)。

改善:

在這種情況下,您需要的是bulk_create ,它將使用類構造函數創建的對象數組作為輸入。 因此,可能的解決方案如下:

def _create_people(self, user):
   person_data = {"first_name": "FN", "surname":"SN", "added_by": user}
   person_list = [Person(**person_data) for i in range(100)]
   Person.objects.bulk_create(person_list)

默認情況下,不論有多少對象, bulk_create命中數據庫一次,但在SQLite中除外(在SQLite中,每個查詢約為999個)。 可以通過參數batch_size指定在單個查詢中可以創建多少個對象。

注意:

  • save()將不會被調用,並且相關的信號也不會被發送。
  • 不適用於m2m關系。

暫無
暫無

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

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