MySQLdb、mysqlclient和MySQL连接器/Python之间有什么区别?

6ju8rftf  于 2023-02-03  发布在  Mysql
关注(0)|答案(5)|浏览(293)

所以我一直在尝试用python做一些数据库更新,在设置整个开发环境时,我遇到了这三件让我头晕目眩的事情。
1.有MySQLdb
1.有mysqlclient
1.然后是mysql connector python
每一个都是什么,区别和在哪里使用它们?谢谢

ifsvaxew

ifsvaxew1#

MySQLdb是一个围绕C模块的瘦Python Package 器,用于实现MySQL数据库的API。
有一段时间以前使用的 Package 器的MySQLDb1版本,现在它被认为是一个遗留。由于MySQLDb 1开始演变到MySQLDb2与错误修复和Python3支持,一个MySQLDb 1是分叉的,这是mysqlclient如何出现,与错误修复和Python3支持。总结,所以现在我们有MySQLDb 2,这是不准备用于生产使用,MySQLDb 1作为一个过时的驱动程序和一个社区支持的mysqlclient,修复了bug并支持Python3。
现在,为了解决这个问题,MySQL提供了他们自己版本的MySQL适配器-mysql connector,这是一个使用MySQL API的所有Python模块,没有C模块依赖性,只使用标准的Python模块。
所以现在的问题是:mysqlclient与mysql连接器的比较.
对我来说,我会选择官方支持的库,但是mysqlclient也应该是一个不错的选择。这两个库都在积极地更新修复和新特性,你可以在最近几天的活动提交中看到。

  • 注意:我对它们没有太多的经验,所以可能会有一个或另一个不适合您的需要的情况。这两个库都遵循PEP-249标准,这意味着您应该至少在任何地方都有基本功能。*
    安装和依赖项
  • mysql客户端

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

f1tvaqid

f1tvaqid2#

当前维护的Python MySQL适配器有三个:

  • mysqlclient-目前最快的MySQL连接器。需要mysql-connector-c C库才能工作。
  • PyMySQL-纯Python MySQL客户端。根据mysqlclientPyMySQL的维护者的说法,在以下情况下应该使用PyMySQL
  • 由于某种原因,您不能使用libmysqlclient
  • 您希望使用gevent或eventlet的monkeypatched套接字。
  • 你不想黑MySQL协议。
  • mysql-connector-python-Oracle的MySQL小组开发的MySQL连接器,也是完全用Python编写的。它的性能似乎是三个中最差的。另外,由于一些许可问题,你不能从PyPI下载它(但现在可以通过conda下载)。

基准测试

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

w1e3prcc

w1e3prcc3#

用户提供了很多选择。聚会有点晚了。但是我的2美分在pypy3.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
lmvvr0a8

lmvvr0a84#

适用于使用SQLAlchemy的开发人员

这个问题是了解Python有哪些DBAPI以及它们的利弊的一个很好的起点。然而,上面提到的库是不断变化的,它们的性能和问题不是一成不变的。因此,测试各个方言并自己评估它们的性能将是一个很好的方法。
我提供了以下链接,列出了可用的DBAPI。这些链接包括对每个库的文档的引用以及对它们的特性和支持的评论。

  • 对于MariaDB:https://docs.sqlalchemy.org/en/14/dialects/mysql.html#module-sqlalchemy.dialects.mysql.base
  • PostgreSQL语言:https://docs.sqlalchemy.org/en/14/dialents/postgresql.html#:~:text = DBAPI%20支持-,%C2%B6,-以下%20方言
  • 更多的数据库方言可以在这里的侧边菜单中找到。

要了解DBAPI的一般含义,请使用此链接,并阅读上面提到的PEP-249。此外,下图可以帮助您直观地了解DBAPI属于architecturally。x1c 0d1x

4nkexdtk

4nkexdtk5#

我还没有做我自己的测试来验证,但根据我所读到的:

    • MySQLdb**、mysqlclientPyMySQL是提供类似API的软件包。

如果你用pip安装MySQLdb包或mysqlclient包,那么会安装一个MySQLdb模块(例如venv/lib/python3.10/site-packages/MySQLdb/),所以无论你安装MySQLdb包还是mysqlclient包,你都可以通过导入MySQLdb来使用它:import MySQLdb.
如果你用pip安装PyMySQL,那么MySQLdb模块不会被安装,但是PyMySQL包含一个install_as_MySQLdb函数,可以用来在运行时在内存中定义一个MySQLdb模块,它实际上引用了PyMySQL。
所以有几种方法可以使用PyMySQL:

  1. import pymysql并像使用MySQLdb一样使用pymysql,因为它具有相同的API。
    1.调用install_as_MySQLdb,然后使用import MySQLdb。(如果依赖项导入MySQLdb,则这可能很有用。)
  2. import pymysql as MySQLdb.
    我的印象是**"MySQL连接器/Python"**提供了一个不同的API。
    (Django的ORM可以和两个API中的任何一个一起使用,也就是说,它可以和MySQLdb/mysqlclient/PyMySQL API,或者"MySQL连接器/Python" API一起使用。

相关问题