2016-11-30 4 views
0

私はユニ日以来、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

なぜ結果を1行ずつ読みたいのですか?各行を計算する前に各行を使う必要がある場合は、各行を操作できるように 'list'に読み込むだけです。 – Acepcs

+0

@Acepcs ermは150millionのレコードを持っていると言っていますが、リストは膨大なレコードをどのように処理していますか? – 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で簡単にPythonでmysqlをストリームする方法です... – Desmond

関連する問題