2016-11-30 47 views
0

自從uni天以來,我非常生疏地使用sql和python。如何使用mysql.connector傳輸結果

我不知道如何逐行讀取查詢結果而不是fetchall?

這裏是我目前的測試代碼:

#!/usr/bin/python 
import time 
import csv 
import mysql.connector 

start_time = time.time() 
cnx = mysql.connector.connect(user='user', password='1234', 
           host='10.0.10.100', 
           database='serverDB') 

try: 
cursor = cnx.cursor() 
cursor.execute("select * from serverDB.task") 
result = cursor.fetchall() 
with open("query.csv", "wb") as csv_file: 
    csv_writer = csv.writer(csv_file) 
    csv_writer.writerow([i[0] for i in cursor.description]) # write headers 
    csv_writer.writerows(result) 

for x, row in enumerate(result): 
    print x 
    print row 
    #print result 
finally: 
cnx.close() 
print "there are ", numrows, "rows" 
print("--- %s seconds ---" % (time.time() - start_time)) 
+0

爲什麼你想一行一行讀取查詢結果?如果你需要在使用前對每一行進行一些計算,你可以將它們讀入一個「列表」中,這樣​​你就可以操作每一行。 – Acepcs

+0

@Acepcs erm說我有1.5億條記錄,列表如何處理大量的記錄? – Desmond

+0

@ ling7334這是篩選 – Desmond

回答

1

有一個叫fetchone功能。這個功能的用法如下:

connect = MySQLdb.connect(......) 
cursor = connect.cursor() 
cursor.execute('select......') 
row_count = cursor.rowcount 

for i in range(row_count): 
    line = cursor.fetchone() #you can operate each line 
+0

謝謝,但這將無法正常工作,因爲csv需要一個序列。如果我要運行fetchone()並將它保存在列表中,內存使用率仍然很高。 – Desmond

+0

好的,如果關鍵問題是內存使用(因爲數據集的大小真的很大),您應該考慮分佈式計算或類似數據集並行化的內容。 – Acepcs

+0

謝謝!我在一個研究實驗室工作,我有HDFS和Elastics Search在我的處置。我的問題在於如何通過java JCDB輕鬆地將mysql與python進行流式處理... – Desmond

相關問題