在写程序的时候,我们不免要和数据库打交道。比如,爬虫存储爬来的数据,Web网站存储数据,数据分析读数据保存结果,都免不了读写数据库。


作为一款著名的开源数据库,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+, 

Python连接MySQL的条条大路_java


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了。