使用pymysql从服务器逐个获取行

时间:2018-01-23 15:51:00

标签: python pymysql

我有一个返回很多行的查询,每行都很大,因为我需要提取BLOB

我按如下方式进行查询:

import pymysql
db = pymysql.connect(...)
with db.cursor() as cur:
    cur.execute("select value from my_blobs")
    for row in cur:
        ...

我天真地期望迭代cur而不是调用fetchall(),会避免一次获取所有数据并在此过程中耗尽内存。但是,我看到的是,在调用cur.execute()期间内存耗尽,也就是说,在我尝试通过fetchall()fetchone()或迭代{{1}之前获取结果之前}}

我的问题是,如何逐一获取我的斑点?我是否必须在应用程序中进行迭代并为每个blob创建一个新查询?那么,如果在cur期间查询整个数据,fetchone或迭代cur会有什么用?

1 个答案:

答案 0 :(得分:1)

默认光标类是缓冲数据。幸运的是,有无缓冲版本:pymysql.cursors.SSCursor。尝试运行db.cursor(pymysql.cursors.SSCursor)而不是db.cursor()

来自API reference for SSCursor

  

Unbuffered Cursor,主要用于返回大量数据的查询,或用于通过慢速网络连接到远程服务器。

     

不是将每行数据复制到缓冲区中,而是根据需要获取行。这样做的好处是客户端使用的内存要少得多,并且在慢速网络上传输或者结果集非常大时返回行的速度要快得多。