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

使用过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相同

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值