【问题标题】:How to stream result with mysql.connector如何使用 mysql.connector 流式传输结果
【发布时间】:2017-04-14 10:53:08
【问题描述】:

自从大学时代以来,我对 sql 和 python 已经很生疏了。

我想知道如何逐行读取查询结果而不是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))

【问题讨论】:

  • 为什么要逐行读取查询结果?如果在使用前需要对每一行进行一些计算,可以直接读入list,这样就可以对每一行进行操作了。
  • @Acepcs erm 说我有 1.5 亿条记录,列表如何处理大量记录?
  • @ling7334 过滤后

标签: python mysql csv


【解决方案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

【讨论】:

  • 谢谢,但这不适用于写入,因为 csv 需要序列。如果我要运行 fetchone() 并将其保存在列表中,内存使用率仍然很高。
  • 好的,所以如果关键问题是内存使用(因为你的数据集的大小真的很大),你应该考虑分布式计算或数据集并行化之类的东西。
  • 谢谢!我在一个研究实验室工作,在那里我可以使用 HDFS 和 Elastics Search。我的问题是如何使用 python 流式传输 mysql,因为它使用 java JCDB 很容易......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多