python读取mysql怎么不会内存溢出

浅浅的花香味﹌ 2022-05-08 06:48 169阅读 0赞

使用过java读取mysql大数据量的人应该都知道,如果查询时不开游标不设置一次性区大小的话,会一次性的把所有记录都拉取过来再进行后续操作,数据量一大就很容易出现OOM

如果用python去读取mysql也会遇到同样的问题

那么这么在python中来设置使用游标呢

也很简单

这里使用pymysql来举例子

普通创建mysql链接是这样的

  1. import pymysql
  2. db = pymysql.connect("localhost","user","password","dbname" )
  3. cursor = db.cursor()
  4. sql = "select * from xxx"
  5. try:
  6. cursor.execute(sql)
  7. results = cursor.fetchall()
  8. for row in results:
  9. xxx....
  10. except:
  11. pass
  12. db.close()

想用游标来控制数据拉取的话,只需要稍加修改就可以

  1. import pymysql
  2. db = pymysql.connect("localhost","user","password","dbname",cursorclass=pymysql.cursors.SSCursor )
  3. cursor = db.cursor()
  4. sql = "select * from xxx"
  5. try:
  6. cursor.execute(sql)
  7. result = cursor.fetchone()
  8. while True:
  9. if result:
  10. xxx....
  11. result = cursor.fetchone()
  12. else:
  13. break
  14. except:
  15. pass
  16. db.close()

这是一条一条读,当然也可以通过设置fetch的大小来一次读一定量的条数

我们来看看cursorclass这个参数是怎么说的

默认值是Cursor,返回的数据是元组形式的

DictCursor,除了返回是词典形式外,其他的与Cursor都相同

SSCursor,是服务端游标,结果集合储存在服务端并且传输行数通过fetch控制,其他与Cursor相同,最好只用在处理很大的数据结果集合上

SSDictCursor,除了返回是词典形式外,其他的与SSCursor相同

发表评论

表情:
评论列表 (有 0 条评论,169人围观)

还没有评论,来说两句吧...

相关阅读