diff options
| author | Federico Caselli <cfederico87@gmail.com> | 2021-12-30 23:29:55 +0100 |
|---|---|---|
| committer | Federico Caselli <cfederico87@gmail.com> | 2022-01-03 21:41:33 +0100 |
| commit | 5e06f0f579df45116696fed78d65abcccc1dc3e3 (patch) | |
| tree | 909165b508dabfa4c67fb54947324da65266b848 /lib/sqlalchemy | |
| parent | 54875c21601eaca01e3217d5b22fab6f6cf50992 (diff) | |
| download | sqlalchemy-5e06f0f579df45116696fed78d65abcccc1dc3e3.tar.gz | |
Imrpove MySQL/MariaDB dialect initialization.
Replace ``SHOW VARIABLES LIKE`` statement with equivalent
``SELECT @@variable`` in MySQL and MariaDB dialect initialization.
This should avoid mutex contention caused by ``SHOW VARIABLES``,
improving initialization performance.
Change-Id: Id836ef534fcc1473c7aaf9270d08a4da9b8f62cf
closes: #7518
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/base.py | 19 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/pyodbc.py | 29 |
2 files changed, 20 insertions, 28 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index 5be057495..f20b9b693 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -3079,24 +3079,21 @@ class MySQLDialect(default.DefaultDialect): # https://dev.mysql.com/doc/refman/en/identifier-case-sensitivity.html charset = self._connection_charset - show_var = connection.execute( - sql.text("SHOW VARIABLES LIKE 'lower_case_table_names'") - ) - row = self._compat_first( - show_var, - charset=charset, + show_var = connection.exec_driver_sql( + "SELECT @@lower_case_table_names" ) + row = self._compat_first(show_var, charset=charset) if not row: cs = 0 else: # 4.0.15 returns OFF or ON according to [ticket:489] # 3.23 doesn't, 4.0.27 doesn't.. - if row[1] == "OFF": + if row[0] == "OFF": cs = 0 - elif row[1] == "ON": + elif row[0] == "ON": cs = 1 else: - cs = int(row[1]) + cs = int(row[0]) self._casing = cs return cs @@ -3115,7 +3112,7 @@ class MySQLDialect(default.DefaultDialect): def _detect_sql_mode(self, connection): row = self._compat_first( - connection.exec_driver_sql("SHOW VARIABLES LIKE 'sql_mode'"), + connection.exec_driver_sql("SELECT @@sql_mode"), charset=self._connection_charset, ) @@ -3126,7 +3123,7 @@ class MySQLDialect(default.DefaultDialect): ) self._sql_mode = "" else: - self._sql_mode = row[1] or "" + self._sql_mode = row[0] or "" def _detect_ansiquotes(self, connection): """Detect and adjust for the ANSI_QUOTES sql mode.""" diff --git a/lib/sqlalchemy/dialects/mysql/pyodbc.py b/lib/sqlalchemy/dialects/mysql/pyodbc.py index 69cc6487d..9cae7b714 100644 --- a/lib/sqlalchemy/dialects/mysql/pyodbc.py +++ b/lib/sqlalchemy/dialects/mysql/pyodbc.py @@ -43,11 +43,11 @@ Pass through exact pyodbc connection string:: """ # noqa import re -import sys from .base import MySQLDialect from .base import MySQLExecutionContext from .types import TIME +from ... import exc from ... import util from ...connectors.pyodbc import PyODBCConnector from ...sql.sqltypes import Time @@ -88,13 +88,14 @@ class MySQLDialect_pyodbc(PyODBCConnector, MySQLDialect): # # If it's decided that issuing that sort of SQL leaves you SOL, then # this can prefer the driver value. - rs = connection.exec_driver_sql( - "SHOW VARIABLES LIKE 'character_set%%'" - ) - opts = {row[0]: row[1] for row in self._compat_fetchall(rs)} - for key in ("character_set_connection", "character_set"): - if opts.get(key, None): - return opts[key] + try: + value = connection.exec_driver_sql( + "select @@character_set_client" + ).scalar() + if value: + return value + except exc.DBAPIError: + pass util.warn( "Could not detect the connection character set. " @@ -121,15 +122,9 @@ class MySQLDialect_pyodbc(PyODBCConnector, MySQLDialect): # https://github.com/mkleehammer/pyodbc/wiki/Unicode pyodbc_SQL_CHAR = 1 # pyodbc.SQL_CHAR pyodbc_SQL_WCHAR = -8 # pyodbc.SQL_WCHAR - if sys.version_info.major > 2: - conn.setdecoding(pyodbc_SQL_CHAR, encoding="utf-8") - conn.setdecoding(pyodbc_SQL_WCHAR, encoding="utf-8") - conn.setencoding(encoding="utf-8") - else: - conn.setdecoding(pyodbc_SQL_CHAR, encoding="utf-8") - conn.setdecoding(pyodbc_SQL_WCHAR, encoding="utf-8") - conn.setencoding(str, encoding="utf-8") - conn.setencoding(unicode, encoding="utf-8") # noqa: F821 + conn.setdecoding(pyodbc_SQL_CHAR, encoding="utf-8") + conn.setdecoding(pyodbc_SQL_WCHAR, encoding="utf-8") + conn.setencoding(encoding="utf-8") return on_connect |
