2015-09-17 18 views
11

ile toplu olarak alma Hacim nedeniyle bu işlemi toplu olarak yapmak istiyorum.Verileri MySQL'den Python

İşte benim kod:

getconn = conexiones() 
con = getconn.mysqlDWconnect() 
with con: 
    cur = con.cursor(mdb.cursors.DictCursor) 
    cur.execute("SELECT id, date, product_id, sales FROM sales") 
    rows = cur.fetchall() 
nasıl gruplar halinde veri getirmek için bir dizin uygulayabilir

?

cevap

18

İlk nokta:

: Gerçekten bellekte aynı anda bir bütün grubu yüklemek için gerekmedikçe, sadece yani yerine, bu özelliği kullanarak başlayabilirsiniz böylece bir piton db-api.cursor, Yineleyicinin
cursor.execute("SELECT * FROM mytable") 
rows = cursor.fetchall() 
for row in rows: 
    do_something_with(row) 

sen tekini:

cursor.execute("SELECT * FROM mytable") 
for row in cursor: 
    do_something_with(row) 

Sonra db bağlayıcı'nın uygulama hala bu özelliğin doğru kullanımını yapmaz, eğer LIMIT ekleyip karışıma OFFSET için zaman olacaktır:

cursor.execute("SELECT count(*) FROM mytable") 
count = cursor.fetchone()[0] 
batch_size = 42 # whatever 

for offset in xrange(0, count, batch_size): 
    cursor.execute(
     "SELECT * FROM mytable LIMIT %s OFFSET %s", 
     (batch_size, offset)) 
    for row in cursor: 
     do_something_with(row) 
+0

Çözümün benimkinden çok daha temizdir! –

4

Eğer sen X ihtiyacınız toplu boyutudur

SELECT id, date, product_id, sales FROM sales LIMIT X OFFSET Y; 

kullanabilir ve Y akalikin cevabı üzerine genişletmek için offset (örneğin akım tekrarlamalar X süreleri sayısı)

0

akımdır Sorguları parçalara bölmek için kademeli yineleme kullanabilir ve sonra da sorguyu yürütmek için LIMIT ve OFFSET kullanabilirsiniz.

cur = con.cursor(mdb.cursors.DictCursor) 
cur.execute("SELECT COUNT(*) FROM sales") 

for i in range(0,cur.fetchall(),5): 
    cur2 = con.cursor(mdb.cursors.DictCursor) 
    cur2.execute("SELECT id, date, product_id, sales FROM sales LIMIT %s OFFSET %s" %(5,i)) 
    rows = cur2.fetchall() 
    print rows 
0

burada senin önerilerle nasıl uyguladıklarını, teşekkür ederiz:

control = True 
index = 0 
while control==True: 
    getconn = conexiones() 
    con = getconn.mysqlDWconnect() 
    with con: 
     cur = con.cursor(mdb.cursors.DictCursor) 
     query = "SELECT id, date, product_id, sales FROM sales limit 10 OFFSET " + str(10 * (index)) 
     cur.execute(query) 
     rows = cur.fetchall() 
     index = index+1   
     if len(rows)== 0: 
      control=False 
    for row in rows: 
     dataset.append(row) 
+1

Gördüğünüz gibi satırlar, 'liste' veya 'liste' gibi 'veri kümesi' nesnesinde göründüğünüzde topluyorsunuz. Bu, toplu işlemin ve doğrudan imleç yinelemenin tüm noktasını yenmek, yani bütün shebang'ı yüklemekten kaçınmaktır bellek ... Bu veri kümesini nasıl kullandığınızı sorabilir miyim? Burada çok daha iyi bir çözüm olabilir, Python'un tembel değerlendirme için güçlü bir desteği var. –

+0

18M satırlık veri kümesini almam gerekiyor, bundan sonra ilgilenmediğim bazı referansları (altküme) temizlemem ve diğeriyle birleştirmem gerekiyor. –

+0

Ve gerçekten tüm veri kümesini belleğe almanız gerekiyor mu? "Büyük" veri kümeleri üzerinde çalışırken, kanonik desen "akış/süreç/yazma" çözümü kullanmaktır. –

İlgili konular