Python連線MySQL的條條大路

王平發表於2019-01-18

在寫程式的時候,我們不免要和資料庫打交道。比如,爬蟲儲存爬來的資料,Web網站儲存資料,資料分析讀資料儲存結果,都免不了讀寫資料庫。

python連MySQL的幾種方式

作為一款著名的開源資料庫,MySQL往往是一個方便快捷的選擇。而Python出了名的庫多,當然連線MySQL的的庫也是不少。雖然庫很多,但都遵循一個標準:PEP-249 Python Database API Specification v2.0。所以,它們的介面也基本上一致,使用起來也方便。

雖然這些MySQL的Python庫介面都一樣,但它們的效能、受歡迎度還是有所差別的。下面我們就討論一下各自的特點,以便選擇適合我們自己的庫。

(1)MySQLdb
這可能是最古老的連線MySQL的Python庫,基於MySQL C API開發,所以它依賴MySQL庫:libmysqlclient。
支援的Python版本:
2.4 – 2.7,不支援3.0+
PyPI主頁:
https://pypi.org/project/MySQL-python/
PyPI安裝:
pip install MySQL-python
程式碼網址:
http://sourceforge.net/projects/mysql-python
程式碼還是放在古老的SourceForge上,且年久失修不再更新。從這裡可以追溯到0.9.1版本是釋出於2001年。

這個庫在Python 2時代用的很多,也是我用Python2時一直使用的庫。但在Python 3時代,它停滯了。取而代之的是,mysqlclient。

(2)mysqlclient
從MySQLdb繼承而來,新增了對python 3的支援,同時修復bug。
支援的Python版本:
2.7, 3.4+
PyPI主頁:
https://pypi.org/project/mysqlclient/
PyPI安裝:
pip install mysqlclient
程式碼網址:
https://github.com/PyMySQL/mysqlclient-python
github上獲得1300+個星,一直都更新。這個github倉庫就是後面PyMySQL組織維護的。

如果你想升級Python 2程式碼到3,那時用的是MySQLdb,又想繼續享受MySQL C API帶來的快速,可以考慮這個庫。

以上兩個MySQL庫都是基於C API,並且不支援asyncio。而資料庫讀寫其實就是IO,利用非同步IO來操作,可以提高你的程式的併發性。比如,非同步爬蟲、非同步web。於是,就出現了純Python實現的PyMySQL,當然它還不是非同步的,非同步的是基於它的aiomysql。

(3)PyMySQL ✔️
基於 PEP-249 規範使用純Python開發的MySQL連線庫,是相當活躍的一個庫,github有4700+個星。如果你已經開始使用Python 3(難度不是必須用3了麼),強烈推薦使用這個庫。我轉到Python 3後就開始使用這個庫了,並仿照tornado對MySQLdb的封裝對其進行了封裝。微信公眾號回覆pymysql可以獲得封裝後的原始碼。

支援的Python版本:
2.7, 3.5+
PyPI主頁:
https://pypi.org/project/PyMySQL/
PyPI安裝:
pip install PyMySQL
程式碼網址:
https://github.com/PyMySQL/PyMySQL

(4)aiomysql
透過asyncio來訪問MySQL資料庫,基於PyMySQL。在你的程式需要非同步訪問資料庫時就可以用此庫。我在使用非同步web框架Sanic時,也做了類似對PyMySQL的封裝叫做 SanicDB。這樣,無論我是非同步還是同步訪問資料庫時,介面基本一致,方便我寫程式碼而已。
支援的Python版本:
3.5+, await/async 語法支援
PyPI主頁:
https://pypi.org/project/aiomysql/
PyPI安裝:
pip install aiomysql
程式碼網址:
https://github.com/aio-libs/aiomysql

github上這個https://github.com/aio-libs/ 有各種支援asyncio的庫,包括大名鼎鼎的 aiohttp、aiomysql、aiopg等。當你的 Python 需要非同步操作時,不妨到那裡去看看,或許有所發現。

(5)MySQL Connector/Python
這是MySQL官方的庫,竟然還以兩種方式實現:純Python和基於MySQL的C庫。這個官方的我之前怎麼一直沒遇到呢?沒有用過也就不做過多評論了。有用過的朋友可以留言說說使用心得哦。

支援的Python版本:2.7,3.5+,

PyPI主頁:
https://pypi.org/project/mysql-connector-python/
PyPI安裝:
pip install mysql-connector-python
官方網址:
https://dev.mysql.com/downloads/connector/python/

除了上面這些MySQL庫,還有些庫已經不再更新就不介紹了。另外,透過ODBC連線MySQL的庫也有,用的很少,需要的自取吧。

結尾:關於ORM
上面介紹的都是API級別的讀寫MySQL,進一步的封裝就是ORM了。對於ORM,不同的人有不同的喜好。對於我來說,它過於繁瑣,不然寫SQL簡潔。但有些人的觀點卻恰恰相反。在我看來,ORM的好處是,對於換資料庫很方便。如果你前期用的MySQL,後來要換成PostgreSQL,ORM在這個時候就凸顯了它的方便,可能僅僅是幾行程式碼的修改量。但是,我一直用MySQL也不打算換庫,所以就一直“簡單”的寫SQL了。

PS:在猿人學Python公眾號回覆’pymysql’獲取對PyMySQL的封裝程式碼。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章