一、三者的異同
1.1 簡單介紹
1. MySQLdb和mysqlclient 的區別:
MySQLdb只支持python 2.x 版本,mysqlclient 是MySQLdb的一個分支,解決了python 3.x 的兼容問題。
2. mysqlclient
1)是一個C擴展模塊,編譯安裝可能會導致報各種錯誤,明顯沒有pymysql方便
2)速度快;
3. pymysql
1)純Python實現的,安裝簡單(直接pip安裝)
2) 由於純Python實現的,可以很好的跟gevent框架結合
1.2 異同點及選擇
pymysql 和 mysqlclient 目前是python連接mysql 的主流方式。
同:兩個庫的作者是同一個人INADA Naoki,pip庫郵箱都指向mailto:songofacandy@gmail.com
異:mysqlclient 速度比pymysql 更快;pymysql更加簡單易使用。
一般要選擇 mysqlclient,除非以下三種情況:
1)你不能用libmysqlclient出於某種原因
2)你想使用gevent or eventlet 配合
3) 考慮mysql協議兼容性
原文是這樣的:
mysqlclient-python is much faster than PyMySQL.
When to use PyMySQL is:
You can't use libmysqlclient for some reason
You want to use monkeypatched socket of gevent or eventlet
You wan't to hack mysql protocol
上面的原因,導致目前使用pymysql的程序員遠超過mysqlclient,特別是第二條,現在的python站點,基本都要用gevent或者eventlet吧。
目前pymysql和mysqlclient的各項指標對比:
https://python.libhunt.com/compare-mysqlclient-python-vs-pymysql
目前,,大多程序猿選擇了簡單易用但是性能較差的pymysql。pymysql比mysqlclient慢許多,如果是大項目pymysql 的弱勢會被放大。建議還是使用速度較快的mysqlclient 。
二、安裝庫
2.1 安裝mysqlclient
關於mysqlclient 的安裝,可以先試試以下命令進行安裝:
pip install mysqlclient
附一張圖:
如果一直安裝失敗,試試通過自己下載mysqlclient 的wheel文件:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
mysqlclient-1.4.6 是版本號
cp36、cp37是python的版本
win32、win_amd64是windows版本
下載完,打開cmd(win+R,輸入cmd,回車)切換到對應的路徑:
- windows系統
如果是C盤,直接用以下命令:
cd [文件路徑]
在其他盤,需要多一步切換盤符,假設是D盤,在cmd先輸入d: ,回車,切換到D盤之后再用【cd [文件路徑]】,注意:cd和路徑間有一個空格。
- Mac系統只有一個盤直接使用以下路徑即可。
cd [文件路徑]
有一個簡單的路徑獲取方法:把路徑拖到cmd或終端即可查看。
切換成功之后,進入下一步,安裝文件:
pip install mysqlclient-1.4.6-cp36-cp36m-win_amd64.whl
安裝完文件,最后一步,安裝模塊(Mac使用pip3):
pip install mysqlclient
當然,也可以直接去官方網站下載壓縮包。
官方鏈接:https://pypi.org/project/mysqlclient/#files
選擇對應的版本下載~(好像沒有指定Mac的,直接下載最后一個源包)
2.2 安裝pymysql
打開cmd,或終端 直接pip install pymysql 即可,如果安裝不了,到官方下載庫進行安裝:
pymysql官方下載鏈接:https://pypi.org/project/PyMySQL/#files
三、測試:_gevent_waiter
其實,
強大的mysqlclient已經解決了,mysqlclient目前也是可以使用gevent了。直接上代碼:
import MySQLdb import gevent.hub def _gevent_waiter(fd, hub=gevent.hub.get_hub()): hub.wait(hub.loop.io(fd, 1)) conn = MySQLdb.connect( db=self.db, host=self.host if not self.ssh else LOOPBACK_ADDRESS, port=self.port if not self.ssh else int(self.ssh.local_bind_port), user=self.user, password=self.passwd, charset=self.charset, connect_timeout=self.connect_timeout, cursorclass=DictCursor, use_unicode=True, waiter=_gevent_waiter,
上面的連接方式,其他參數不多解釋了,就說waiter吧,有了這個相當於mysqlclinet可以完美配合gevent了。
不了解那個_gevent_waiter,可以看看這篇文章 gevent hub 。
那么,我們怎么測試呢?測試過程比較簡單,起一個單進程的 web服務,連接數據庫的時候查詢的時候,在數據庫執行time.sleep 20秒,這個時候看其他請求這個 web服務還能處理請求不,用了waiter=_gevent_waiter完美啊。。。
有了這個,一個擁有大量數據庫查詢服務的系統,我可能再也不會用tornado了。。
原文:https://blog.csdn.net/qq_45476428/article/details/108693031