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

आनं*_*नंद 62 python mysql database mysql-connector mysql-python

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

  1. MySQLdb

  2. mysqlclient

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

他们每个人,差异以及在哪里使用它们是什么?谢谢

Tar*_*syk 60

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

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

现在,为了解决这个问题,MySQL提供了自己的MySQL适配器版本 - mysql连接器,一个全内置的python模块,它使用没有C模块依赖的 MySQL API,只使用了标准的python模块.

所以现在问题归结为:mysqlclient vs mysql连接器.

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

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

安装和依赖

  • 的mysql

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


ost*_*ach 44

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

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

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

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

基准

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

  • 所以看起来像`PyMySQL`仍然是使用PyPy的方法. (2认同)
  • 当数据库URL以mysql:// ...开头时,@ vishal AFAIK mysqlclient是sqlalchemy使用的默认连接器。要使用`PyMySQL`,请以`mysql + pymysql:// ...`开始URL。要使用mysql-connector-python,请以mysql + mysqlconnector:// ...开头。有关更多信息,请参见[sqlalchemy docs](https://docs.sqlalchemy.org/en/latest/dialects/mysql.html#module-sqlalchemy.dialects.mysql.mysqldb)。 (2认同)
  • 仅供参考,官方包 `mysql-connector-python` 也可以使用 C 扩展:https://dev.mysql.com/doc/connector-python/en/connector-python-cext.html (2认同)

Doo*_*gle 5

用户提供了很多选择。聚会晚点。但是我对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]
Run Code Online (Sandbox Code Playgroud)

循环...从以前的基准测试...

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
Run Code Online (Sandbox Code Playgroud)