【问题标题】:What's the difference between MySQLdb, mysqlclient and MySQL connector/Python?MySQLdb、mysqlclient 和 MySQL 连接器/Python 有什么区别?
【发布时间】:2017-08-23 11:14:22
【问题描述】:

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

  1. MySQLdb

  2. mysqlclient

  3. 然后有一个mysql connector python

它们各自是什么,有什么区别以及在哪里使用它们?谢谢

【问题讨论】:

  • 大多数语言都有多个数据库适配器层,它们的复杂程度、支持和质量水平各不相同。
  • mysqlclient 是 MySQLdb 的 fork 版本,支持 python3.3+,mysql connector 是 mysql 的官方模块。
  • 我们也有pymysql

标签: python mysql database mysql-python mysql-connector


【解决方案1】:

MySQLdb 是一个围绕 C 模块的瘦 python 包装器,它实现了 MySQL 数据库的 API。

前段时间使用了MySQLDb1 版本的包装器,现在它被认为是遗留的。随着 MySQLDb1 开始演变为 MySQLDb2 并带有错误修复和 Python3 支持,MySQLDb1 被分叉,这就是 mysqlclient 出现的方式,带有错误修复和 Python3 支持。总结一下,现在我们有了 MySQLDb2,它还没有准备好用于生产环境,MySQLDb1 作为一个过时的驱动程序,以及一个社区支持的 mysqlclient,修复了错误并支持 Python3。

现在,为了解决这个问题,MySQL 提供了他们自己版本的 MySQL 适配器 - mysql connector,这是一个使用 MySQL API 的全功能 python 模块,没有 C 模块依赖项 并且只使用标准 python 模块。

所以现在问题归结为:mysqlclient vs mysql connector。

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

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

安装和依赖

  • mysql客户端

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

【讨论】:

    【解决方案2】:

    目前维护的有用于 Python 的 MySQL 适配器:

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

    • PyMySQL - 纯 Python MySQL 客户端。 According to the maintainer of both mysqlclient and PyMySQL,你应该使用PyMySQL 如果:

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

    基准测试

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

    【讨论】:

    • 所以看起来PyMySQL 仍然是使用 PyPy 的方法。
    • 如果您在编译 mysqlclient 时遇到问题,您可以通过 wheel 包安装它,如下所述:stackoverflow.com/a/31077052/2848256
    • sqlalchemy 支持 mysqlclient 吗?
    • @vishal AFAIK mysqlclient 是当您的数据库 URL 以 mysql://... 开头时 sqlalchemy 使用的默认连接器。要使用PyMySQL,请以mysql+pymysql://... 开头您的URL。要使用 mysql-connector-python,请以 mysql+mysqlconnector://... 开头您的 URL。请参阅sqlalchemy docs 了解更多信息。
    • 仅供参考,官方包mysql-connector-python也可以使用C扩展:dev.mysql.com/doc/connector-python/en/…
    【解决方案3】:

    用户提供了很多选项。聚会有点晚了。但是我的2 美分 继续为 pypy 3.7 版本进行基准测试。

    如果你想要更快的访问和重复访问,请坚持使用 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
    

    【讨论】:

      【解决方案4】:

      适用于使用 SQLAlchemy 的开发人员

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

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

      要了解 DBAPI 的一般含义,请使用 link,以及阅读上面提到的 PEP-249。此外,下图可以帮助您可视化 DBAPI 所属的位置architecturally

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        • 2011-05-23
        • 2011-09-01
        • 1970-01-01
        • 2017-01-03
        • 2023-03-29
        • 2011-09-19
        相关资源
        最近更新 更多