pymysql生成器方式查询大量数据

CSDN 发表于 2021/06/15 22:30:53 2021/06/15
【摘要】 对于大数据量的查询请求,最好使用pymysql.cursors.SSDictCursor游标类,其可以让fetchone依次读取每条数据记录,不用占用非常大的内存,非常适合大数据量的请求。 官方原文: Unbuffered Cursor, mainly useful for queries that return a lot of data, or for c...

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

官方原文:

Unbuffered Cursor, mainly useful for queries that return a lot of
data, or for connections to remote servers over a slow network.

Instead of copying every row of data into a buffer, this will fetch
rows as needed. The upside of this is the client uses much less
memory, and rows are returned much faster when traveling over a slow
network or if the result set is very big.

There are limitations, though. The MySQL protocol doesn’t support
returning the total number of rows, so the only way to tell how many
rows there are is to iterate over every row returned. Also, it
currently isn’t possible to scroll backwards, as only the current row
is held in memory.

def get_news(column_id, max_id): """ 生成器方式获取数据 :return: """ 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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

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

参考:
https://pymysql.readthedocs.io/en/latest/modules/cursors.html#pymysql.cursors.SSCursor

文章来源: blog.csdn.net,作者:小龙在山东,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lilongsy/article/details/117851597

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。