MySQLdb、mysqlclient和MySQLconnector/Python有什么区别?
What's the difference between MySQLdb, mysqlclient and MySQL connector/Python?
所以我一直在尝试使用 python 进行一些数据库更新,并且在设置整个开发环境时,我遇到了这三件让我头晕的事情。
它们分别是什么、区别以及在哪里使用它们?谢谢
MySQLdb 是 C 模块的薄 python 包装器,它为 MySQL 数据库实现 API。
出现了 MySQLDb1 version of wrapper used some time ago and now it is considered to be a legacy. As MySQLDb1 started evolving to MySQLDb2 with bug fixes and Python3 support, a MySQLDb1 was forked and here is how mysqlclient,修复了错误并提供了 Python3 支持。总结一下,现在我们有 MySQLDb2,它还没有准备好用于生产,MySQLDb1 作为一个过时的驱动程序和一个社区支持的 mysql客户端,修复了错误和 Python3支持。
现在,为了解决这个问题,MySQL 提供了他们自己的 MySQL 适配器版本 - mysql connector,一个使用 [=48 的全集成 python 模块=] API 无 C 模块依赖性 且仅使用标准 python 模块。
所以现在问题归结为:mysql客户端与 mysql 连接器。
对于我来说,我会选择官方支持的库,但是 mysqlclient
应该也是一个不错的选择。
他们都在积极更新修复和新功能,您可以通过最近几天的积极提交看到这些。
注意:我对它们没有太多经验,所以可能存在其中一种或另一种不适合您的需要的情况。这两个库都遵循 PEP-249 标准,这意味着您应该至少在任何地方都具备基本功能。
安装和依赖项
- mysql客户端
作为 C 包装器的一个分支,它需要 C 模块与 MySQL 一起工作,它添加了 python 头文件来构建这些扩展(阅读 python-dev)。安装取决于您使用的系统,只要确保您知道包名称并可以安装它们即可。
- mysql 连接器
Main documentation is pretty clear, however you should be aware of Protobuf C++ dependency (for mysql connector versions >= 2.2.3).
MySQL 当前维护的 Python 适配器:
mysqlclient
- 迄今为止 CPython 最快的 MySQL 连接器。需要 mysql-connector-c
C 库才能工作。
PyMySQL
- Pure Python MySQL client. According to the maintainer of both mysqlclient
and PyMySQL
,你应该使用 PyMySQL
如果:
- 由于某些原因,您无法使用
libmysqlclient
。
- 您想使用 gevent 或 eventlet 的 monkeypatched socket。
- 你不想破解 mysql 协议。
mysql-connector-python
- MySQL 连接器由 Oracle 的 MySQL 组开发,也完全用 Python 编写。它的性能似乎是三者中最差的。此外,由于某些许可问题,您无法从 PyPI 下载它(但现在可以通过 conda 下载)。
基准
根据以下基准测试,mysqlclient
比纯 Python 客户端更快(有时快 > 10 倍)。
A lot of options provided by users. Little late to party. But my 2
cents in on with benchmarking for pypy 3.7 version.
如果您想要更快的访问和重复访问,请坚持使用 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
对于使用 SQLAlchemy 的开发人员
这个问题是了解哪些 DBAPI 可用于 Python 及其权衡的良好起点。然而,上面提到的库是千变万化的,它们的性能和问题并不是一成不变的。因此,测试各个方言并自己评估它们的表现将是一个很好的方法。
我在下面提供了列出可用 DBAPI 的链接。这些链接包括对每个库文档的引用以及对其功能和支持的评论。
- 对于 MariaDB:https://docs.sqlalchemy.org/en/14/dialects/mysql.html#module-sqlalchemy.dialects.mysql.base
- PostgreSQL:https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#:~:text=DBAPI%20Support-,%C2%B6,-The%20following%20dialect
- 可以在侧边菜单中找到更多数据库方言 here。
要了解一般的 DBAPI 是什么,请使用此 link, as well as reading the above mentioned PEP-249. In addition, the diagram below can help you visualise where DBAPIs belong architecturally。
所以我一直在尝试使用 python 进行一些数据库更新,并且在设置整个开发环境时,我遇到了这三件让我头晕的事情。
它们分别是什么、区别以及在哪里使用它们?谢谢
MySQLdb 是 C 模块的薄 python 包装器,它为 MySQL 数据库实现 API。
出现了 MySQLDb1 version of wrapper used some time ago and now it is considered to be a legacy. As MySQLDb1 started evolving to MySQLDb2 with bug fixes and Python3 support, a MySQLDb1 was forked and here is how mysqlclient,修复了错误并提供了 Python3 支持。总结一下,现在我们有 MySQLDb2,它还没有准备好用于生产,MySQLDb1 作为一个过时的驱动程序和一个社区支持的 mysql客户端,修复了错误和 Python3支持。
现在,为了解决这个问题,MySQL 提供了他们自己的 MySQL 适配器版本 - mysql connector,一个使用 [=48 的全集成 python 模块=] API 无 C 模块依赖性 且仅使用标准 python 模块。
所以现在问题归结为:mysql客户端与 mysql 连接器。
对于我来说,我会选择官方支持的库,但是 mysqlclient
应该也是一个不错的选择。
他们都在积极更新修复和新功能,您可以通过最近几天的积极提交看到这些。
注意:我对它们没有太多经验,所以可能存在其中一种或另一种不适合您的需要的情况。这两个库都遵循 PEP-249 标准,这意味着您应该至少在任何地方都具备基本功能。
安装和依赖项
- mysql客户端
作为 C 包装器的一个分支,它需要 C 模块与 MySQL 一起工作,它添加了 python 头文件来构建这些扩展(阅读 python-dev)。安装取决于您使用的系统,只要确保您知道包名称并可以安装它们即可。
- mysql 连接器 Main documentation is pretty clear, however you should be aware of Protobuf C++ dependency (for mysql connector versions >= 2.2.3).
MySQL 当前维护的 Python 适配器:
mysqlclient
- 迄今为止 CPython 最快的 MySQL 连接器。需要mysql-connector-c
C 库才能工作。PyMySQL
- Pure Python MySQL client. According to the maintainer of bothmysqlclient
andPyMySQL
,你应该使用PyMySQL
如果:- 由于某些原因,您无法使用
libmysqlclient
。 - 您想使用 gevent 或 eventlet 的 monkeypatched socket。
- 你不想破解 mysql 协议。
- 由于某些原因,您无法使用
mysql-connector-python
- MySQL 连接器由 Oracle 的 MySQL 组开发,也完全用 Python 编写。它的性能似乎是三者中最差的。此外,由于某些许可问题,您无法从 PyPI 下载它(但现在可以通过 conda 下载)。
基准
根据以下基准测试,mysqlclient
比纯 Python 客户端更快(有时快 > 10 倍)。
A lot of options provided by users. Little late to party. But my 2 cents in on with benchmarking for pypy 3.7 version.
如果您想要更快的访问和重复访问,请坚持使用 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
对于使用 SQLAlchemy 的开发人员
这个问题是了解哪些 DBAPI 可用于 Python 及其权衡的良好起点。然而,上面提到的库是千变万化的,它们的性能和问题并不是一成不变的。因此,测试各个方言并自己评估它们的表现将是一个很好的方法。
我在下面提供了列出可用 DBAPI 的链接。这些链接包括对每个库文档的引用以及对其功能和支持的评论。
- 对于 MariaDB:https://docs.sqlalchemy.org/en/14/dialects/mysql.html#module-sqlalchemy.dialects.mysql.base
- PostgreSQL:https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#:~:text=DBAPI%20Support-,%C2%B6,-The%20following%20dialect
- 可以在侧边菜单中找到更多数据库方言 here。
要了解一般的 DBAPI 是什么,请使用此 link, as well as reading the above mentioned PEP-249. In addition, the diagram below can help you visualise where DBAPIs belong architecturally。