pymysql流式游标

Python通过pymysql操作向mysql读取千万、百万级别的数据库时

如果用传统的fetchall()fetchone()方法,都是先默认在内存里缓存下所有行然后再处理,大量的数据会导致内存资源消耗光,内存容易溢出

此时则建议使用SSCursor(流式游标),避免客户端占用大量内存

这个 cursor 实际上没有缓存下来任何数据,它不会读取所有所有到内存中,它的做法是从储存块中读取记录,并且一条一条返回给你,使用迭代器而不用 fetchall ,即省内存又能很快拿到数据

例:

def select_pan_url(self):
    db = pymysql.connect(host='localhost', port=3306, user='root', passwd='', db='')
    cursor = db.cursor(cursor=pymysql.cursors.SSDictCursor)

    select_sql = "select `name`, `detail_url`, `pan_title`, `pan_psw`, `pan_real_url` from agepan_wj"
    try:
        cursor.execute(select_sql)
        # 在处理大量数据时可以分割进行
        datas = cursor.fetchall()
        for pan in datas:
            self.row_lists.append(pan)
    except Exception as e:
        print('取数据失败', e)
        db.rollback()
    finally:
        cursor.close()
        db.close()

需要注意的是:

因为SSCursor是没有缓存的游标,结果集只要没取完,这个connect是不能再处理别的sql,包括另外生成一个cursor 也不行的,如果需要干别的,请另外再生成一个连接对象

每次读取后处理数据要快,不能超过 60 s,否则mysql将会断开这次连接

也可以修改SET NET_WRITE_TIMEOUT = xx来增加超时间隔

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据库编程概述、pymysql基本操作方法总结、参数化列表防止SQL注入总结 2.6 Python数据库编程 学习...
    Cestine阅读 1,618评论 0 2
  • python 版本3.6 系统版本window 10 本文部分内容参考 reference:http://www....
    sky_memory阅读 648评论 0 0
  • 关键字:入手pymysql,增删改查,日期格式化,基金数据入库 通过前面几篇博客,我们已经能简单的得到基金...
    谜00016阅读 1,653评论 0 2
  • 人的一生,不管是个体,还是开公司,其实都是自我管理的过程,而不是管理别人。 苦学一生,学的就是自我的管理。因为只有...
    余里里的小花阅读 393评论 0 0
  • 韩寒的《乘风破浪》毫无悬念的站在了各种评论的风口浪尖上。 有人说,韩寒自以为很高明,实际上拍了一部比后会无期更烂的...
    Cde三言两语阅读 486评论 0 0