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
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()
MVC3 kullanarak Varlık Çerçevesi için ...
Django model bir listesini saklamak iç...
Bir ağaca doğru düz bir masa ayrıştırm...
Otomatik oluşturmak SQL Server tablo i...
HTML elemanları jQuery kullanarak oluş...