有没有办法在 MariaDB 10.4.7 中使用 mysql-connector-python 中的 'pool_reset_connection'?
Is there a way to use 'pool_reset_connection' from mysql-connector-python with MariaDB 10.4.7?
我想将我的 python 程序从普通连接更改为连接池,以便在几个小时内没有发送任何查询以及数据库未被发送时数据库连接不会丢失在使用高峰期一次被一堆查询淹没。
我正在使用 Python 3.7.4、mysql-connector-python 8.0.17 和 MariaDB 10.4.7。
当我使用普通连接时它工作正常,但 MariaDB 显然不支持 mysql.connector.pooling.MySQLConnectionPool
的 pool_reset_session
设置
在我的代码开头,如果数据库不存在,它会尝试创建数据库,这会导致我收到错误。
import mysql.connector as mariadb
from mysql.connector import errorcode
from mysql.connector import pooling
cnx = mariadb.pooling.MySQLConnectionPool(user='root', password='password', host='localhost',
pool_name='connectionpool', pool_size=10, pool_reset_session=True)
try:
db = cnx.get_connection()
cursor = db.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS tests")
print("Created database")
except mariadb.Error as err:
print(f"Failed creating database: {err}")
finally:
print("Finally (create)")
db.close()
我原以为这段代码只会创建数据库 tests
,但我却收到了以下两个错误:
mysql.connector.errors.NotSupportedError: MySQL version 5.7.2 and earlier does not support COM_RESET_CONNECTION.
以及
mysql.connector.errors.OperationalError: 1047 (08S01): Unknown command
从回溯日志来看,这似乎是由于尝试在第 17 行执行 db.close()
引起的。
带回溯的完整输出:
https://pastebin.com/H3SAvA9N
我在问我能做些什么来解决这个问题,以及是否可以在 MariaDB 10.4.7 中使用这种连接池(我很困惑,因为它说 MySQL <= 5.7。 2 不支持使用后重置连接,即使我使用 MariaDB 10.4.7)
我还发现 MariaDB Connector/J 确实提供了这样一个选项,称为 useResetConnection
但我不想学习 Java 只是为了这个功能。
将服务器版本升级到 10.0 时,MariaDB 必须为服务器版本添加前缀以避免破坏复制(复制协议需要一位数的主版本号,有关更多信息,请查看此 )。
无论您使用 MariaDB 10.0 还是 10.4,MySQL Connector/Python 将始终 return 版本号 5.5.5:
>>> conn= mysql.connector.connect(user="foo")
>>> print(conn.get_server_version())
(5, 5, 5)
>>> cursor=conn.cursor()
>>> cursor.execute("select version()")
>>> row=cursor.fetchone()
>>> print(row)
('10.4.7-MariaDB-log',)
COM_RESET_CONNECTION
在 MariaDB 10.2 中引入了重置服务器端连接的功能,因此要使其正常工作,您必须更改 MySQL Connector/Python 的代码,例如在 _check_server_version (abstracts.py):
+ if server_version.startswith("5.5.5-")
+ server_version= server_version[6:]
这当然不是通用解决方案,因为它不适用于 10.2 之前的 MariaDB 版本。在检查 MariaDB 不支持的 X-Protocol 等某些功能时,它也可能会产生不良副作用。
正如@Georg Richter 指出的那样,MariaDB 由于历史原因 return 类似的版本
“5.5.5-10.4.10-MariaDB-1:10.4.10+maria~bionic-log”
MySQL python 连接器明确检查版本 (https://github.com/mysql/mysql-connector-python/blob/b034f25ec8037f5d60015bf2ed4ee278ec12fd17/lib/mysql/connector/connection.py#L1157) 并且由于 MariaDB 服务器显示为版本 5.5.5,因此引发错误。
从 MariaDB 10.2.6 开始,您可以明确地将 version
添加到 cnf 文件的 [server] 部分。
配置如下:
[server]
. . .
version=5.7.99-10.4.10-MariaDB
连接器将看到版本 5.7.99,并相应地运行。
我在使用 MariaDB 的 mysql-connector-python 时遇到了同样的问题,我将 mysql-connector-python 版本降级到 8.0.12 并且它对我有用
我想将我的 python 程序从普通连接更改为连接池,以便在几个小时内没有发送任何查询以及数据库未被发送时数据库连接不会丢失在使用高峰期一次被一堆查询淹没。
我正在使用 Python 3.7.4、mysql-connector-python 8.0.17 和 MariaDB 10.4.7。
当我使用普通连接时它工作正常,但 MariaDB 显然不支持 mysql.connector.pooling.MySQLConnectionPool
pool_reset_session
设置
在我的代码开头,如果数据库不存在,它会尝试创建数据库,这会导致我收到错误。
import mysql.connector as mariadb
from mysql.connector import errorcode
from mysql.connector import pooling
cnx = mariadb.pooling.MySQLConnectionPool(user='root', password='password', host='localhost',
pool_name='connectionpool', pool_size=10, pool_reset_session=True)
try:
db = cnx.get_connection()
cursor = db.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS tests")
print("Created database")
except mariadb.Error as err:
print(f"Failed creating database: {err}")
finally:
print("Finally (create)")
db.close()
我原以为这段代码只会创建数据库 tests
,但我却收到了以下两个错误:
mysql.connector.errors.NotSupportedError: MySQL version 5.7.2 and earlier does not support COM_RESET_CONNECTION.
以及
mysql.connector.errors.OperationalError: 1047 (08S01): Unknown command
从回溯日志来看,这似乎是由于尝试在第 17 行执行 db.close()
引起的。
带回溯的完整输出: https://pastebin.com/H3SAvA9N
我在问我能做些什么来解决这个问题,以及是否可以在 MariaDB 10.4.7 中使用这种连接池(我很困惑,因为它说 MySQL <= 5.7。 2 不支持使用后重置连接,即使我使用 MariaDB 10.4.7)
我还发现 MariaDB Connector/J 确实提供了这样一个选项,称为 useResetConnection
但我不想学习 Java 只是为了这个功能。
将服务器版本升级到 10.0 时,MariaDB 必须为服务器版本添加前缀以避免破坏复制(复制协议需要一位数的主版本号,有关更多信息,请查看此
无论您使用 MariaDB 10.0 还是 10.4,MySQL Connector/Python 将始终 return 版本号 5.5.5:
>>> conn= mysql.connector.connect(user="foo")
>>> print(conn.get_server_version())
(5, 5, 5)
>>> cursor=conn.cursor()
>>> cursor.execute("select version()")
>>> row=cursor.fetchone()
>>> print(row)
('10.4.7-MariaDB-log',)
COM_RESET_CONNECTION
在 MariaDB 10.2 中引入了重置服务器端连接的功能,因此要使其正常工作,您必须更改 MySQL Connector/Python 的代码,例如在 _check_server_version (abstracts.py):
+ if server_version.startswith("5.5.5-")
+ server_version= server_version[6:]
这当然不是通用解决方案,因为它不适用于 10.2 之前的 MariaDB 版本。在检查 MariaDB 不支持的 X-Protocol 等某些功能时,它也可能会产生不良副作用。
正如@Georg Richter 指出的那样,MariaDB 由于历史原因 return 类似的版本 “5.5.5-10.4.10-MariaDB-1:10.4.10+maria~bionic-log”
MySQL python 连接器明确检查版本 (https://github.com/mysql/mysql-connector-python/blob/b034f25ec8037f5d60015bf2ed4ee278ec12fd17/lib/mysql/connector/connection.py#L1157) 并且由于 MariaDB 服务器显示为版本 5.5.5,因此引发错误。
从 MariaDB 10.2.6 开始,您可以明确地将 version
添加到 cnf 文件的 [server] 部分。
配置如下:
[server]
. . .
version=5.7.99-10.4.10-MariaDB
连接器将看到版本 5.7.99,并相应地运行。
我在使用 MariaDB 的 mysql-connector-python 时遇到了同样的问题,我将 mysql-connector-python 版本降级到 8.0.12 并且它对我有用