pymysql使用SSCursor(流式游标),避免占用大量内存

对于大数据量的查询请求,最好使用​​pymysql.cursors.SSDictCursor​​游标类,其可以让 fetchone 依次读取每条数据记录,不用占用非常大的内存,非常适合大数据量的请求。

    def get_news(column_id, max_id):
        """生成器方式获取数据"""
        conn = pymysql.connect(host=DB_HOST, user=DB_USER, password=DB_PASS, db=DB_NAME, charset='utf8mb4',
                               cursorclass=pymysql.cursors.SSDictCursor)
        sql = "SELECT * FROM `news`"
        with conn.cursor() as cursor:
            cursor.execute(sql)
            result = cursor.fetchone()
            while result is not None:
                yield result
                result = cursor.fetchone()
        conn.close()

注意:
因为 ​​​SSCursor​​​ 是没有缓存的游标, 结果集只要没取完,这个 ​​conn​​​ 是不能再处理别的 sql,包括另外生成一个​​cursor​​也不行的,否则会打乱游标的位置。如果需要干别的,请另外再生成一个连接对象。

每次读取后处理数据要快,不能超过 30s,否则 mysql 将会断开这次连接,也可以修改​​net_read_timeout​​​,如​​set global net_read_timeout = 200​​​ 来增加超时间隔,查看用​​SHOW VARIABLES LIKE ‘%net_read_timeout%’​​。

正文完
 0
评论(没有评论)