python連接mysql,使用mysqldb和mysqlclient、pymysql三者的異同


一、三者的異同

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM