MySQLdb,mysqlclient和MySQL连接器/ Python有什么区别?


91

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

  1. MySQLdb

  2. mysqlclient

  3. 然后有一个mysql连接器python

它们各有什么,区别和在哪里使用?谢谢


1
大多数语言都有一些复杂程度,支持程度和质量各不相同的数据库适配器层。
塔德曼

mysqlclient是MySQLdb的分支版本,具有python3.3 +支持,并且mysql连接器是mysql的官方模块。
warungman

3
我们也有pymysql
Cenk Alti

Answers:


77

MySQLdb是围绕C模块的瘦Python包装器,该模块实现MySQL数据库的API。

MySQLDb1包装的版本中使用前一段时间,现在它被认为是一个遗留问题。作为MySQLDb1开始发展到MySQLDb2与bug修复和Python3支持下,MySQLDb1是分叉的,这里是如何的mysql出现,补丁与Python3支持。总结一下,所以现在我们有尚未投入​​生产的MySQLDb2,过时的驱动程序MySQLDb1和社区支持的mysqlclient以及错误修复和Python3支持。

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

因此,现在的问题归结为:mysqlclient vs mysql connector。

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

注意:我对它们没有太多的经验,因此在某些情况下,一个或另一个可能无法满足您的需求。这两个库都遵循PEP-249标准,这意味着您应该在任何地方都至少具备基本功能。

安装和依赖性

  • mysql客户端

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


66

当前维护着用于Python的MySQL适配器:

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

  • PyMySQL-纯Python MySQL客户端。根据双方的维护者mysqlclientPyMySQL,你应该使用PyMySQL,如果:

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

基准测试

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


2
因此PyMySQL,如果使用PyPy,看起来仍然是要走的路。
radtek

:如果你有编译的mysql的问题,您可以在这里所描述的通过轮包安装stackoverflow.com/a/31077052/2848256
ИскренСтаниславов

sqlalchemy支持mysqlclient吗?
维沙尔

4
mysqlclient当数据库URL以开头时,@ vishal AFAIK是sqlalchemy使用的默认连接器mysql://...。要使用PyMySQL,请使用开头URL mysql+pymysql://...。要使用mysql-connector-python,请使用开头URL mysql+mysqlconnector://...。有关更多信息,请参见sqlalchemy文档
ostrokach

11

用户提供了很多选择。聚会晚点。但是我对pypy 3.7版本的基准测试只差了2美分

如果想要更快的访问和重复的访问,请坚持使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.