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

版权声明:转载请注明原链接 https://blog.csdn.net/cowcomic/article/details/82988178

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

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

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

也很简单

这里使用pymysql来举例子

普通创建mysql链接是这样的

import pymysql
 
db = pymysql.connect("localhost","user","password","dbname" )
  
cursor = db.cursor()
 
sql = "select * from xxx"
try:
   cursor.execute(sql)
   results = cursor.fetchall()
   for row in results:
      xxx....
except:
   pass

db.close()

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

import pymysql
 
db = pymysql.connect("localhost","user","password","dbname",cursorclass=pymysql.cursors.SSCursor )
  
cursor = db.cursor()
 
sql = "select * from xxx"
try:
   cursor.execute(sql)
   result = cursor.fetchone()
   while True:
      if result:
         xxx....
         result = cursor.fetchone()
      else:
         break
except:
   pass

db.close()

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/cowcomic/article/details/82988178
今日推荐