mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-30 12:34:52 -04:00
Get MySQL version info from @@version
MySQL dialects now query the server version using ``SELECT @@version``
explicitly to the server to ensure we are getting the correct version
information back. Proxy servers like MaxScale interfere with the value
that is passed to the DBAPI's connection.server_version value so this
is no longer reliable.
Change-Id: Iafd39be8c9bf1982d58b34cc997ae1016ad6c48c
Fixes: #4205
(cherry picked from commit 9ba77e8d3b682bff89fdab5e80271a96a52fe8c8)
(cherry picked from commit 5c1ebbc370)
This commit is contained in:
+10
@@ -0,0 +1,10 @@
|
||||
.. change::
|
||||
:tags: bug, mysql
|
||||
:tickets: 4205
|
||||
:versions: 1.2.5, 1.3.0b1
|
||||
|
||||
MySQL dialects now query the server version using ``SELECT @@version``
|
||||
explicitly to the server to ensure we are getting the correct version
|
||||
information back. Proxy servers like MaxScale interfere with the value
|
||||
that is passed to the DBAPI's connection.server_version value so this
|
||||
is no longer reliable.
|
||||
@@ -1583,6 +1583,27 @@ class MySQLDialect(default.DefaultDialect):
|
||||
val = val.decode()
|
||||
return val.upper().replace("-", " ")
|
||||
|
||||
def _get_server_version_info(self, connection):
|
||||
# get database server version info explicitly over the wire
|
||||
# to avoid proxy servers like MaxScale getting in the
|
||||
# way with their own values, see #4205
|
||||
dbapi_con = connection.connection
|
||||
cursor = dbapi_con.cursor()
|
||||
cursor.execute("SELECT VERSION()")
|
||||
val = cursor.fetchone()[0]
|
||||
cursor.close()
|
||||
if util.py3k and isinstance(val, bytes):
|
||||
val = val.decode()
|
||||
|
||||
version = []
|
||||
r = re.compile(r'[.\-]')
|
||||
for n in r.split(val):
|
||||
try:
|
||||
version.append(int(n))
|
||||
except ValueError:
|
||||
version.append(n)
|
||||
return tuple(version)
|
||||
|
||||
def do_commit(self, dbapi_connection):
|
||||
"""Execute a COMMIT."""
|
||||
|
||||
@@ -1754,6 +1775,9 @@ class MySQLDialect(default.DefaultDialect):
|
||||
|
||||
@property
|
||||
def _mariadb_normalized_version_info(self):
|
||||
# MariaDB's wire-protocol prepends the server_version with
|
||||
# the string "5.5"; now that we use @@version we no longer see this.
|
||||
|
||||
if self._is_mariadb:
|
||||
idx = self.server_version_info.index('MariaDB')
|
||||
return self.server_version_info[idx - 3: idx]
|
||||
|
||||
@@ -56,17 +56,6 @@ class MySQLDialect_cymysql(MySQLDialect_mysqldb):
|
||||
def dbapi(cls):
|
||||
return __import__('cymysql')
|
||||
|
||||
def _get_server_version_info(self, connection):
|
||||
dbapi_con = connection.connection
|
||||
version = []
|
||||
r = re.compile(r'[.\-]')
|
||||
for n in r.split(dbapi_con.server_version):
|
||||
try:
|
||||
version.append(int(n))
|
||||
except ValueError:
|
||||
version.append(n)
|
||||
return tuple(version)
|
||||
|
||||
def _detect_charset(self, connection):
|
||||
return connection.connection.charset
|
||||
|
||||
|
||||
@@ -161,11 +161,6 @@ class MySQLDialect_mysqlconnector(MySQLDialect):
|
||||
def _mysqlconnector_double_percents(self):
|
||||
return not util.py3k and self._mysqlconnector_version_info < (2, 0)
|
||||
|
||||
def _get_server_version_info(self, connection):
|
||||
dbapi_con = connection.connection
|
||||
version = dbapi_con.get_server_version()
|
||||
return tuple(version)
|
||||
|
||||
def _detect_charset(self, connection):
|
||||
return connection.connection.charset
|
||||
|
||||
|
||||
@@ -181,17 +181,6 @@ class MySQLDialect_mysqldb(MySQLDialect):
|
||||
opts['client_flag'] = client_flag
|
||||
return [[], opts]
|
||||
|
||||
def _get_server_version_info(self, connection):
|
||||
dbapi_con = connection.connection
|
||||
version = []
|
||||
r = re.compile(r'[.\-]')
|
||||
for n in r.split(dbapi_con.get_server_info()):
|
||||
try:
|
||||
version.append(int(n))
|
||||
except ValueError:
|
||||
version.append(n)
|
||||
return tuple(version)
|
||||
|
||||
def _extract_error_code(self, exception):
|
||||
return exception.args[0]
|
||||
|
||||
|
||||
@@ -220,17 +220,6 @@ class MySQLDialect_oursql(MySQLDialect):
|
||||
|
||||
return [[], opts]
|
||||
|
||||
def _get_server_version_info(self, connection):
|
||||
dbapi_con = connection.connection
|
||||
version = []
|
||||
r = re.compile(r'[.\-]')
|
||||
for n in r.split(dbapi_con.server_info):
|
||||
try:
|
||||
version.append(int(n))
|
||||
except ValueError:
|
||||
version.append(n)
|
||||
return tuple(version)
|
||||
|
||||
def _extract_error_code(self, exception):
|
||||
return exception.errno
|
||||
|
||||
|
||||
Reference in New Issue
Block a user