美文网首页
pymysql流式游标

pymysql流式游标

作者: 不存在的一角 | 来源:发表于2020-01-28 12:27 被阅读0次

    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流式游标

          本文链接:https://www.haomeiwen.com/subject/legpthtx.html