MySQLdb、mysqlclient和MySQLconnector/Python有什么区别?

What's the difference between MySQLdb, mysqlclient and MySQL connector/Python?

所以我一直在尝试使用 python 进行一些数据库更新,并且在设置整个开发环境时,我遇到了这三件让我头晕的事情。

  1. MySQLdb

  2. mysqlclient

  3. 然后是 mysql connector python

它们分别是什么、区别以及在哪里使用它们?谢谢

MySQLdb 是 C 模块的薄 python 包装器,它为 MySQL 数据库实现 API。

出现了 MySQLDb1 version of wrapper used some time ago and now it is considered to be a legacy. As MySQLDb1 started evolving to MySQLDb2 with bug fixes and Python3 support, a MySQLDb1 was forked and here is how mysqlclient,修复了错误并提供了 Python3 支持。总结一下,现在我们有 MySQLDb2,它还没有准备好用于生产,MySQLDb1 作为一个过时的驱动程序和一个社区支持的 mysql客户端,修复了错误和 Python3支持。

现在,为了解决这个问题,MySQL 提供了他们自己的 MySQL 适配器版本 - mysql connector,一个使用 [=48 的全集成 python 模块=] API 无 C 模块依赖性 且仅使用标准 python 模块。

所以现在问题归结为:mysql客户端与 mysql 连接器。

对于我来说,我会选择官方支持的库,但是 mysqlclient 应该也是一个不错的选择。 他们都在积极更新修复和新功能,您可以通过最近几天的积极提交看到这些。

注意:我对它们没有太多经验,所以可能存在其中一种或另一种不适合您的需要的情况。这两个库都遵循 PEP-249 标准,这意味着您应该至少在任何地方都具备基本功能。

安装和依赖项

  • mysql客户端

作为 C 包装器的一个分支,它需要 C 模块与 MySQL 一起工作,它添加了 python 头文件来构建这些扩展(阅读 python-dev)。安装取决于您使用的系统,只要确保您知道包名称并可以安装它们即可。

MySQL 当前维护的 Python 适配器:

  • mysqlclient - 迄今为止 CPython 最快的 MySQL 连接器。需要 mysql-connector-c C 库才能工作。

  • PyMySQL - Pure Python MySQL client. According to the maintainer of both mysqlclient and PyMySQL,你应该使用 PyMySQL 如果:

    • 由于某些原因,您无法使用 libmysqlclient
    • 您想使用 gevent 或 eventlet 的 monkeypatched socket。
    • 你不想破解 mysql 协议。
  • mysql-connector-python - MySQL 连接器由 Oracle 的 MySQL 组开发,也完全用 Python 编写。它的性能似乎是三者中最差的。此外,由于某些许可问题,您无法从 PyPI 下载它(但现在可以通过 conda 下载)。

基准

根据以下基准测试,mysqlclient 比纯 Python 客户端更快(有时快 > 10 倍)。

A lot of options provided by users. Little late to party. But my 2 cents in on with benchmarking for pypy 3.7 version.

如果您想要更快的访问和重复访问,请坚持使用 mysqlclient

MySQL Connector/Python: 23.096168518066406 [sec]
mysqlclient: 6.815327882766724 [sec]
PyMySQL: 24.616853952407837 [sec]
MySQL Connector/Python: 22.619106769561768 [sec]
mysqlclient: 6.607790231704712 [sec]
PyMySQL: 24.410773038864136 [sec]

循环...来自之前的基准测试...

def q100k(cur):
    t = time.time()
    for _ in range(100000):
        cur.execute("SELECT 1,2,3,4,5,6")
        res = cur.fetchall()
        assert len(res) == 1
        assert res[0] == (1, 2, 3, 4, 5, 6)
    return time.time() - t

对于使用 SQLAlchemy 的开发人员

这个问题是了解哪些 DBAPI 可用于 Python 及其权衡的良好起点。然而,上面提到的库是千变万化的,它们的性能和问题并不是一成不变的。因此,测试各个方言并自己评估它们的表现将是一个很好的方法。

我在下面提供了列出可用 DBAPI 的链接。这些链接包括对每个库文档的引用以及对其功能和支持的评论。

要了解一般的 DBAPI 是什么,请使用此 link, as well as reading the above mentioned PEP-249. In addition, the diagram below can help you visualise where DBAPIs belong architecturally