淺談Python訪問MySQL的正確姿勢
Py2 時(shí)代,訪問 MySQL 數(shù)據(jù)庫的模塊除了 PyMySQL 和 MySQL-python 之外,還有以速度見長的 Umysql,以及非常小眾的 Oursql 模塊。進(jìn)入了 Py3 時(shí)代之后,PyMySQL 與時(shí)俱進(jìn),順利升級(jí)到 Py3 版本, MySQL-python 則被它的一個(gè) Py3 分支——mysqlclient 取代,而 Umysql 和 Oursql 則停留在了屬于它們的那個(gè)時(shí)代。
下表給出了 PyMySQL 模塊和 mysqlclient 模塊在安裝方式、導(dǎo)入方式、支持的Python版本和數(shù)據(jù)庫版本等方面的比較。因?yàn)槿鄙倏尚诺馁Y料,這里沒有對(duì)兩個(gè)模塊的性能做出比較。不過,PyMySQL 明確聲明支持最新的 MySQL 和 MariaDB,而 mysqlclient 關(guān)于數(shù)據(jù)庫版本支持的描述顯得模棱兩可、似是而非,所以很多人也許會(huì)把 PyMySQL 作為首選。但從我們的實(shí)際應(yīng)用來看,mysqlclient 并沒有受到過數(shù)據(jù)庫版本的限制。我更愿意把版本支持的表述解讀為兩個(gè)開發(fā)團(tuán)隊(duì)風(fēng)格不同所致。
PyMySQL | mysqlclient | |
---|---|---|
安裝方式 | pip install PyMySQL | pip install mysqlclient |
導(dǎo)入方式 | import pymysql | import MySQLdb |
Python版本 | 2.7 and >= 3.4 | 2.7 and >= 3.4 |
數(shù)據(jù)庫版本 | MySQL >= 5.5 MariaDB >= 5.5 |
MySQL versions from 3.23 to 5.5; 5.0 or newer recommended. MariaDB should also work. |
有趣的是,不管是 PyMySQL,還是 MySQL-python,或者后來取而代之的 mysqlclient,它們?cè)谟梅ㄉ蠋缀跬耆恢拢憾际腔?Python database API version 2.0,這個(gè)標(biāo)準(zhǔn)也被稱作 PEP-0249。這意味著,我們不用修改代碼,就可以更換數(shù)據(jù)庫客戶端。下面的應(yīng)用實(shí)例證明了這一點(diǎn):除了模塊名字不一樣,其余代碼完全一致。
姿勢1:以元組形式返回查詢記錄
我們以 PyMySQL 模塊為例,先來看看最常見的用法:以元組形式返回查詢記錄。如果把代碼中的 pymysql 改為 MySQLdb,可以輕松切換成 mysqlclient 模塊。
>>> import pymysql >>> db = pymysql.connect( host = 'localhost', user = 'xufive', password = '********', db = 'demo', charset = 'utf8' ) >>> cursor = db.cursor() >>> cursor.execute('select * from member where id = %s', (100,)) 1 >>> print(cursor.fetchall()) ((100, '370103********0012', '*9EE8E3304D69C3E9260F19C224EA5852129BF030', '王茁洋', '男', datetime.date(****, **, **), '', '濟(jì)南', '濟(jì)南泉景小學(xué)', '186********', Decimal('1812.50')),) >>> cursor.close() >>> db.close()
姿勢2:以字典形式返回查詢記錄
查詢結(jié)果以元組形式返回,有很多不便,我們需要知道元組各元素對(duì)應(yīng)的是表結(jié)構(gòu)中的哪一個(gè)字段(列)。下面的代碼,實(shí)現(xiàn)了以字典形式返回查詢記錄。同樣的,如果把代碼中的 MySQLdb 改為 pymysql,可以輕松切換成 PyMySQL 模塊。
>>> import MySQLdb.cursors >>> db = MySQLdb.connect( host = 'localhost', user = 'xufive', password = '********', db = 'demo', charset = 'utf8', cursorclass = MySQLdb.cursors.DictCursor ) >>> with db.cursor() as cursor: sql = 'select * from member where id = %s' cursor.execute(sql, (100,)) print(cursor.fetchall()) 1 ({'id': 100, 'idcard': '370103********0012', 'passwd': '*9EE8E3304D69C3E9260F19C224EA5852129BF030', 'name': '王茁洋', 'sex': '男', 'birthday': datetime.date(****, **, **), 'title': '', 'address': '濟(jì)南', 'club': '濟(jì)南泉景小學(xué)', 'phone': '186********', 'rating': Decimal('1812.50')},)
姿勢3:事務(wù)回滾
事務(wù)是關(guān)系型數(shù)據(jù)庫的重要特性,NoSQL數(shù)據(jù)庫、分布式數(shù)據(jù)庫通常會(huì)淡化、甚至放棄事務(wù)。所謂事務(wù)是將一組DML(insert、update、delete)語句組合在一起形成一個(gè)邏輯單元,這些操作要么全部執(zhí)行成功提交(commit),如果不成功就要回退到事務(wù)開始之前的狀態(tài)(rollback),以確保不會(huì)停留在錯(cuò)誤的中間狀態(tài)。下面的代碼演示了 MySQL 典型的事務(wù)回滾應(yīng)用。
>>> import pymysql >>> db = pymysql.connect( host = 'localhost', user = 'xufive', password = '********', db = 'demo', charset = 'utf8' ) def transaction(db): try: db.begin() # 此處加入出錯(cuò)之后需要回滾的DML(insert、update、delete)語句 db.commit() return True except: db.rollback() return False
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python使用BeautifulSoup與正則表達(dá)式爬取時(shí)光網(wǎng)不同地區(qū)top100電影并對(duì)比
這篇文章主要給大家介紹了關(guān)于python使用BeautifulSoup與正則表達(dá)式爬取時(shí)光網(wǎng)不同地區(qū)top100電影并對(duì)比的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Python爬取數(shù)據(jù)并實(shí)現(xiàn)可視化代碼解析
這篇文章主要介紹了Python爬取數(shù)據(jù)并實(shí)現(xiàn)可視化代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08python實(shí)現(xiàn)數(shù)通設(shè)備端口監(jiān)控示例
這篇文章主要介紹了python實(shí)現(xiàn)數(shù)通設(shè)備端口監(jiān)控示例,需要的朋友可以參考下2014-04-04python破解WiFi教程代碼,Python蹭網(wǎng)原理講解
用Python生成一個(gè)簡單的密碼本,一般是有數(shù)字、字母和符號(hào)組成,這里用到的思路主要是窮舉法。通過使用pywifi?模塊,根據(jù)密碼本暴力破解WiFi。本文只是從技術(shù)的角度來闡述學(xué)習(xí)Pywifi庫!并不建議大家做任何破壞性的操作和任何不當(dāng)?shù)男袨椋?/div> 2023-01-01Python利用機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)垃圾郵件的識(shí)別
今天教大家利用簡單的機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)垃圾郵件識(shí)別,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Django 路由層URLconf的實(shí)現(xiàn)
這篇文章主要介紹了Django 路由層URLconf的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12最新評(píng)論