对于大数据量的查询请求,最好使用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%’。
正文完