1. 程式人生 > >python讀取mysql怎麼不會記憶體溢位

python讀取mysql怎麼不會記憶體溢位

使用過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相同