成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么PyMySQL獲取一條數(shù)據(jù)會(huì)讓內(nèi)存爆炸

開發(fā) 前端
當(dāng)Python 有讀寫 MySQL 數(shù)據(jù)的需求時(shí),我們經(jīng)常使用PyMySQL這個(gè)第三方庫(kù)來(lái)完成。

 當(dāng)Python 有讀寫 MySQL 數(shù)據(jù)的需求時(shí),我們經(jīng)常使用PyMySQL這個(gè)第三方庫(kù)來(lái)完成。

[[317112]]

有時(shí)候如果一張表里面的數(shù)據(jù)非常大,但是我們只需要讀取一條數(shù)據(jù),此時(shí)我們可能會(huì)想當(dāng)然地使用cursor.fetchone()這個(gè)方法,以為這樣就真的可以只讀取一條數(shù)據(jù):

 

  1. import pymysql 
  2.  
  3.  
  4. connection = pymysql.connect(host='localhost'
  5.                              user='user'
  6.                              password='passwd'
  7.                              db='db'
  8.                              charset='utf8mb4'
  9.                              cursorclass=pymysql.cursors.DictCursor) 
  10.                               
  11. with connection.cursor() as cursor
  12.     db = 'select * from users where age > 10' 
  13.     cursor.execute(db) 
  14.     one_user = cursor.fetchone() 

但實(shí)際上,上面這段代碼,與下面這段代碼沒(méi)有任何區(qū)別:

 

  1. ... 
  2. with connection.cursor() as cursor
  3.     sql = 'select * from users where age > 10' 
  4.     cursor.execute(sql) 
  5.     all_users = cursor.fetchall() 
  6.     one_user = all_users[0] 

這是因?yàn)椋?dāng)我們執(zhí)行到cursor.execute(sql)的時(shí)候,PyMySQL就已經(jīng)把表里面所有的數(shù)據(jù)讀取到內(nèi)存中了。而后面的cursor.fetchall()或者cursor.fetchone()只不過(guò)是從內(nèi)存中返回全部數(shù)據(jù)還是返回1條數(shù)據(jù)而已。

我們來(lái)看PyMySQL的源代碼[1]。在cursor.execute()方法代碼如下圖所示:

 

 

其中第163行調(diào)用了self._query方法。我們?cè)偃サ竭@個(gè)方法里面:

 

看到代碼第322行,調(diào)用了self._do_get_result()方法。我們?cè)偃ミ@個(gè)方法里面看看:

 

注意代碼第342行,此時(shí)已經(jīng)把所有數(shù)據(jù)存放到了self._rows列表中。

現(xiàn)在我們來(lái)看cursor.fetchone()方法:

 

可以看到,這里不過(guò)是從列表里面根據(jù)下標(biāo)讀取一條數(shù)據(jù)出來(lái)而已。

再看cursor.fetchall()方法:

 

如果之前先多次調(diào)用過(guò)cursor.fetchone(),那么self.rownumber會(huì)持續(xù)增加。而調(diào)用cursor.fetchall()時(shí),跳過(guò)之前已經(jīng)返回過(guò)的數(shù)據(jù),直接返回剩下的全部數(shù)據(jù)即可。如果之前沒(méi)有調(diào)用過(guò)cursor.fetchone(),那么直接返回全部數(shù)據(jù)。

所以,單純使用cursor.fetchone()并不能節(jié)省內(nèi)存,如果表里面的數(shù)據(jù)非常大,還是會(huì)有內(nèi)存爆炸的危險(xiǎn)。

那么真正的解決辦法是什么呢?真正的解決辦法在創(chuàng)建數(shù)據(jù)庫(kù)連接的時(shí)候指定游標(biāo)類型。pymysql.connect有一個(gè)參數(shù)叫做cursorclass,把它的值設(shè)定為pymysql.SSDictCursor即可解決問(wèn)題。

我們來(lái)看一下如何正確使用它:

 

  1. import pymysql 
  2.  
  3.  
  4. connection = pymysql.connect(host='localhost'
  5.                              user='user'
  6.                              password='passwd'
  7.                              db='db'
  8.                              charset='utf8mb4'
  9.                              cursorclass=pymysql.cursors.SSDictCursor) 
  10.                               
  11. with connection.cursor() as cursor
  12.     db = 'select * from users where age > 10' 
  13.     cursor.execute(db) 
  14.     for row in cursor
  15.         print('對(duì) cursor 直接進(jìn)行迭代,每循環(huán)一次,從數(shù)據(jù)庫(kù)讀取一條數(shù)據(jù)。不會(huì)提前把所有數(shù)據(jù)讀取到內(nèi)存中。'
  16.         print(row['name']) 

 

責(zé)任編輯:華軒 來(lái)源: 未聞Code
相關(guān)推薦

2023-06-18 23:13:27

MySQL服務(wù)器客戶端

2019-06-24 11:07:34

數(shù)據(jù)數(shù)據(jù)庫(kù)存儲(chǔ)

2020-09-03 20:10:23

Elasticsear存儲(chǔ)數(shù)據(jù)

2025-04-02 04:33:00

CPU服務(wù)器時(shí)鐘頻率

2019-03-28 10:09:49

內(nèi)存CPU硬盤

2018-03-30 09:42:05

2024-09-09 08:15:20

2023-09-01 14:07:00

ChatGPTGPT數(shù)據(jù)分析

2024-04-19 07:31:58

MySQL數(shù)據(jù)庫(kù)

2021-02-09 09:50:21

SQLOracle應(yīng)用

2024-02-01 18:07:37

2025-04-01 05:22:00

JavaThread變量

2022-10-18 08:38:16

內(nèi)存泄漏線程

2020-03-27 16:05:49

數(shù)據(jù)庫(kù)數(shù)據(jù)MySQL

2022-05-18 08:25:59

MySQLutf8字符集數(shù)據(jù)庫(kù)

2012-06-20 16:22:57

2018-04-24 14:58:06

內(nèi)存降價(jià)漲價(jià)

2021-12-02 15:30:55

命令內(nèi)存Linux

2012-11-08 14:28:16

2013-06-19 10:55:40

Disruptor并發(fā)框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品视频一区二区三区 | 亚洲精品国产成人 | 一级黄色片日本 | 日韩一区二区在线观看 | 欧美极品视频在线观看 | www.欧美| julia中文字幕久久一区二区 | 免费观看a级毛片在线播放 黄网站免费入口 | 在线免费观看黄色网址 | 日韩国产专区 | 日本福利视频 | 亚洲高清一区二区三区 | 97视频在线观看网站 | 精品久久久一区 | 久久精品视频一区二区 | 伊人免费观看视频 | 二区在线观看 | 亚洲视频观看 | 作爱视频免费观看 | 久久久99精品免费观看 | 成人一区二区三区在线观看 | 免费午夜视频 | 精品不卡 | 中文字幕不卡在线观看 | 日一区二区 | 91精品国产91久久久久青草 | www.亚洲.com | 免费在线h视频 | 五月婷婷导航 | 中文字幕日韩欧美一区二区三区 | 久国产视频 | 久久久一区二区三区四区 | 欧洲精品码一区二区三区免费看 | 黄色大片观看 | 岛国av免费在线观看 | 欧美视频在线观看 | 久久国产精品一区 | 很黄很污的网站 | 精品一区二区在线看 | 6080yy精品一区二区三区 | 亚洲欧美日韩在线 |