2015-09-10 23 views
5

Normal queryset veya yineleyici queryset yöntemlerinin tek bir çekimde tüm veri kümesini değerlendirip döndürdüğünün farkındayım.Queryset verilerini tek tek alma

örneğin bunu al: Her iki yöntemde de

my_objects = MyObject.objects.all() 
for rows in my_objects:   # Way 1 
for rows in my_objects.iterator(): # Way 2 

Soru

tüm satırlar orada single-go.Is QuerySet satırları olabilir djago içinde herhangi bir şekilde içinde getirilen veritabanından tek tek getirildi. Benim sorgu getirir Şu anda

bu garip Gereği sağlayan Neden

n satırları söylüyor ama bazen ben Python and Django OperationalError (2006, 'MySQL server has gone away') olsun.

yüzden, ben şu anda herhangi yerli veya dahili yöntemdir ya benim sorum ilk etapta bile mantıklı olup olmadığını logic.So merak döngü garip while kullanıyorum bunun için bir çözüm olması !!

cevap

2

Sanırım limit your query set'a bakıyorsunuz. yukarıdaki bağlantıdan

Alıntı:

sonuçları belli numaraya Sorgu Kümesi sınırlamak için Python'un dizi dilimleme sözdizimi bir alt kümesini kullanın. Bu, SQL’in LIMIT ve OFFSET deyimlerinin karşılığıdır. Başka bir deyişle

, size daha sonra döngü Tabii

cnt = MyObject.objects.count() 
start_point = 0 
inc = 5 
while start_point + inc < cnt: 
    filtered = MyObject.objects.all()[start_point:inc] 
    start_point += inc 

.. üzerinde ve bunları gerektiren olarak dilim almak bu daha ele hata gerekebilir bir sayısı ile başlarsanız ..

+0

Ben, tabii bu kesinlikle etrafında kazma ederken ben kabul var bir yoludur :) – Sayse

+0

tercih olacağını, buradan asıl sorunu düzeltmek içine baktım varsayıyorum neat.I duyuyorum görünüyor sınırsız django kendi içinde başka * yerli * yolu olup olmadığını merak? Asıl konuya gelince, o zaman, django sürümü ile ilgili, ancak tüm proje buna dayandığı için, bu konuda bir şey yapamam ..... – NoobEditor

+0

@NoobEditor - Bu, gerçekleştirdiğiniz sorguyu değiştireceğinden, alacağınız kadarıyla yerel olduğunu düşünüyorum. Yine de, db'de birden çok sorgu gerçekleştirirsiniz, ancak yalnızca bir kerede N sonuçlarına dönersiniz. Diğer seçenek, gerçekten dönmek zorunda olduğunuz şeylere bakmak ve bu değerleri döndürmek için 'değerler'i kullanmaktır. (Ayrıca benim örneğimde bir seferde sadece 5 aldığımı düşünürdüm, bir kereden daha fazlasını halledebileceğinizi düşünürdüm) – Sayse

2

Satırda satırın getirilmesi daha da kötü olabilir. 1000s için toplu olarak almak isteyebilirsiniz. Ben çok büyük querysets ile başarıyla used this django snippet (benim işim değil) var. Hafızayı yitirmez ve giden bağlantılarla hiçbir sorun olmaz. yaklaşımınız mantıklı değildir,

import gc 

def queryset_iterator(queryset, chunksize=1000): 
    ''''' 
    Iterate over a Django Queryset ordered by the primary key 

    This method loads a maximum of chunksize (default: 1000) rows in it's 
    memory at the same time while django normally would load all rows in it's 
    memory. Using the iterator() method only causes it to not preload all the 
    classes. 

    Note that the implementation of the iterator does not support ordered query sets. 
    ''' 
    pk = 0 
    last_pk = queryset.order_by('-pk')[0].pk 
    queryset = queryset.order_by('pk') 
    while pk < last_pk: 
     for row in queryset.filter(pk__gt=pk)[:chunksize]: 
      pk = row.pk 
      yield row 
     gc.collect() 
+0

sizin url açılış dostum değil! – NoobEditor

+0

@ e4c5: http: //https//djangosnippets.org/snippets/1949/ adresine yönlendiriliyorsunuz ... ama herhangi bir sayfa gösterilmiyor. : D – NoobEditor

+0

Snippet kopyalayıp yapıştırarak yanıtlandı. – e4c5

1

çözmek için (2006, 'MySQL server has gone away') sorun:

İşte o bağlantıdan pasajı bu. Her giriş için veritabanına basarsanız, uygulamanızın kullanımı arttıkça gelecekte sorun yaratacağı sorguların sayısını artıracaktır. Mysql bağlantısını, sonucun tüm öğelerini yineledikten sonra kapatmanız gerektiğini düşünüyorum ve sonra başka bir sorgu oluşturmaya çalışırsanız, django yeni bir bağlantı oluşturacaktır.

from django.db import connection: 
connection.close() 

Refer this for more details

+0

sorunu "bağlantı" queryset getirilirken dökülüyor ... bu yüzden hata.Yani kapatıp başla ve yeni bağlantı olsa bile, ben yine aynı sorunla karşılaştım.Internet bağlantıları '& 'is_usable' denedim ama yardım yok! : \ – NoobEditor

İlgili konular