SORU
16 Temmuz 2009, PERŞEMBE


Bir SQLite tablo Django kullanarak binlerce kayıt ekleme verimli bir yolu nedir?

Bir SQLite veritabanı var Django ORM kullanarak takın 8000 kayıtları var. Bu işlemi dakikada bir kez hakkında bir cron süreci olarak çalıştırılması gerekiyor.< / ^ br . Şu anda döngü için tüm öğeleri arasında yineleme ve bunları teker teker ekleyin için kullanıyorum.< / ^ br . Örnek:

for item in items:
    entry = Entry(a1=item.a1, a2=item.a2)
    entry.save()

Bunu verimli bir yolu nedir?< / ^ br . < / ^ br . < / ^ br . Düzenleme:İki ekleme yöntemleri arasında küçük bir karşılaştırma.< / ^ br .

Olmadan commit_manually (11245 kayıtları) dekoratör:

nox@noxdevel marinetraffic]$ time python manage.py insrec             

real    1m50.288s
user    0m6.710s
sys     0m23.445s

Commit_manually dekoratör (11245 kayıtları) kullanılarak:

[nox@noxdevel marinetraffic]$ time python manage.py insrec                

real    0m18.464s
user    0m5.433s
sys     0m10.163s

Not:testsenaryo da bazı diğer işlemleri ayrıca ekleme veritabanına (indirme bir ZİP dosyası, özleri bir XML dosyasından ZIP arşivi, ayrıştırmak XML dosyası) bu kadar zaman için gerekli yürütme değil mutlaka temsil zaman gerekli Ekle kayıtları.

CEVAP
16 Temmuz 2009, PERŞEMBE


django.db.transaction.commit_manually kontrol etmek istiyorum.

http://docs.djangoproject.com/en/dev/topics/db/transactions/#django-db-transaction-commit-manually

Gibi bir şey olur:

from django.db import transaction

@transaction.commit_manually
def viewfunc(request):
    ...
    for item in items:
        entry = Entry(a1=item.a1, a2=item.a2)
        entry.save()
    transaction.commit()

Sadece bir kez karışan kişiler, bunun yerine her Kaydet().

Django 1.3 bağlam yöneticileri tanıtıldı. Şimdi kullanabilirsiniztransaction.commit_on_success()benzer bir şekilde:

from django.db import transaction

def viewfunc(request):
    ...
    with transaction.commit_on_success():
        for item in items:
            entry = Entry(a1=item.a1, a2=item.a2)
            entry.save()

Django 1.4, bulk_create, modeli nesneleri listeleri oluşturmak ve hepsini aynı anda kaydedilmeye için izin eklendi.

NOTkayıt yöntemi toplu oluşturmak kullanırken adlı olmayacaktır.

>>> Entry.objects.bulk_create([
...     Entry(headline="Django 1.0 Released"),
...     Entry(headline="Django 1.1 Announced"),
...     Entry(headline="Breaking: Django is awesome")
... ])

1.6 . django ^strong>transaction.atomictanıtıldı, şimdi eski fonksiyonları commit_on_success commit_manually geçirirler.

django documentation on atomic:

atom, hem de dekoratör olarak kullanılabilir

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

ve içerik yöneticisi olarak:

from django.db import transaction

def viewfunc(request):
    # This code executes in autocommit mode (Django's default).
    do_stuff()

    with transaction.atomic():
        # This code executes inside a transaction.
        do_more_stuff()

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • LinusTechTips

    LinusTechTip

    25 Kasım 2008