python讀取mysql怎麼不會記憶體溢位
阿新 • • 發佈:2018-11-02
使用過java讀取mysql大資料量的人應該都知道,如果查詢時不開遊標不設定一次性區大小的話,會一次性的把所有記錄都拉取過來再進行後續操作,資料量一大就很容易出現OOM
如果用python去讀取mysql也會遇到同樣的問題
那麼這麼在python中來設定使用遊標呢
也很簡單
這裡使用pymysql來舉例子
普通建立mysql連結是這樣的
import pymysql db = pymysql.connect("localhost","user","password","dbname" ) cursor = db.cursor() sql = "select * from xxx" try: cursor.execute(sql) results = cursor.fetchall() for row in results: xxx.... except: pass db.close()
想用遊標來控制資料拉取的話,只需要稍加修改就可以
import pymysql db = pymysql.connect("localhost","user","password","dbname",cursorclass=pymysql.cursors.SSCursor ) cursor = db.cursor() sql = "select * from xxx" try: cursor.execute(sql) result = cursor.fetchone() while True: if result: xxx.... result = cursor.fetchone() else: break except: pass db.close()
這是一條一條讀,當然也可以通過設定fetch的大小來一次讀一定量的條數
我們來看看cursorclass這個引數是怎麼說的
預設值是Cursor,返回的資料是元組形式的
DictCursor,除了返回是詞典形式外,其他的與Cursor都相同
SSCursor,是服務端遊標,結果集合儲存在服務端並且傳輸行數通過fetch控制,其他與Cursor相同,最好只用在處理很大的資料結果集合上
SSDictCursor,除了返回是詞典形式外,其他的與SSCursor相同