MySQLdb,mysqlclient和MySQL连接器/ Python之间的区别是什么?

时间:2017-03-29 19:23:53

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

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

  1. MySQLdb

  2. mysqlclient

  3. 然后是mysql connector python
  4. 他们每个人,他们之间的区别和使用位置是什么?感谢

3 个答案:

答案 0 :(得分:53)

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

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

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

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

至于我,我会选择官方支持的库,但mysqlclient也应该是一个不错的选择。 他们都正在积极更新修复程序和新功能,您可以在过去几天通过活动提交看到它们。

注意:我对它们没有太多经验,因此可能会出现这样或那样的情况,无法满足您的需求。这两个库都遵循PEP-249标准,这意味着您应该可以在任何地方使用至少基本功能。

安装和依赖

  • 的mysqlclient

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

答案 1 :(得分:26)

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

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

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

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

基准

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

答案 2 :(得分: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