]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug which prevented MySQLdb-based dialects (e.g.
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 3 Feb 2014 17:04:51 +0000 (12:04 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 3 Feb 2014 17:06:57 +0000 (12:06 -0500)
pymysql) from working in Py3K, where a check for "connection
charset" would fail due to Py3K's more strict value comparison
rules.  The call in question  wasn't taking the database
version into account in any case as the server version was
still None at that point, so the method overall has been
simplified to rely upon connection.character_set_name().
[ticket:2933]

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/connectors/mysqldb.py
lib/sqlalchemy/dialects/mysql/pymysql.py
setup.cfg

index 85d7026857d124cb13a448d8dc28023c7a41b29f..f9e0b9a45615936feaeae922237a6898eebdd258 100644 (file)
 .. changelog::
     :version: 0.8.5
 
+    .. change::
+        :tags: bug, mysql
+        :tickets: 2933
+        :versions: 0.9.3
+
+        Fixed bug which prevented MySQLdb-based dialects (e.g.
+        pymysql) from working in Py3K, where a check for "connection
+        charset" would fail due to Py3K's more strict value comparison
+        rules.  The call in question  wasn't taking the database
+        version into account in any case as the server version was
+        still None at that point, so the method overall has been
+        simplified to rely upon connection.character_set_name().
+
     .. change::
         :tags: bug, mysql
         :pullreq: github:61
index 5f4b3e4d329d0fd3a73de83155399d23dcae05e6..44af402514fe80473a654f5249c0ca052a3f0070 100644 (file)
@@ -121,36 +121,17 @@ class MySQLDBConnector(Connector):
     def _detect_charset(self, connection):
         """Sniff out the character set in use for connection results."""
 
-        # Note: MySQL-python 1.2.1c7 seems to ignore changes made
-        # on a connection via set_character_set()
-        if self.server_version_info < (4, 1, 0):
-            try:
-                return connection.connection.character_set_name()
-            except AttributeError:
-                # < 1.2.1 final MySQL-python drivers have no charset support.
-                # a query is needed.
-                pass
-
-        # Prefer 'character_set_results' for the current connection over the
-        # value in the driver.  SET NAMES or individual variable SETs will
-        # change the charset without updating the driver's view of the world.
-        #
-        # If it's decided that issuing that sort of SQL leaves you SOL, then
-        # this can prefer the driver value.
-        rs = connection.execute("SHOW VARIABLES LIKE 'character_set%%'")
-        opts = dict([(row[0], row[1]) for row in self._compat_fetchall(rs)])
-
-        if 'character_set_results' in opts:
-            return opts['character_set_results']
         try:
-            return connection.connection.character_set_name()
+            # note: the SQL here would be
+            # "SHOW VARIABLES LIKE 'character_set%%'"
+            cset_name = connection.connection.character_set_name
         except AttributeError:
-            # Still no charset on < 1.2.1 final...
-            if 'character_set' in opts:
-                return opts['character_set']
-            else:
-                util.warn(
-                    "Could not detect the connection character set with this "
-                    "combination of MySQL server and MySQL-python. "
-                    "MySQL-python >= 1.2.2 is recommended.  Assuming latin1.")
-                return 'latin1'
+            util.warn(
+                "No 'character_set_name' can be detected with "
+                "this MySQL-Python version; "
+                "please upgrade to a recent version of MySQL-Python.  "
+                "Assuming latin1.")
+            return 'latin1'
+        else:
+            return cset_name()
+
index ba48017ac9bc14063cca0b5698713b1b15f3a93d..cfa4520fa940cd143274bf761463064090705c74 100644 (file)
@@ -31,6 +31,7 @@ class MySQLDialect_pymysql(MySQLDialect_mysqldb):
     if py3k:
         supports_unicode_statements = True
 
+
     @classmethod
     def dbapi(cls):
         return __import__('pymysql')
index 92bdbc40f4c8dc17c1341bd43bbf8a40ae1863ef..102be891ba17d0dac8209b2a3b1059bd02fc1b93 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -32,7 +32,9 @@ pg8000=postgresql+pg8000://scott:tiger@127.0.0.1:5432/test
 postgresql_jython=postgresql+zxjdbc://scott:tiger@127.0.0.1:5432/test
 mysql_jython=mysql+zxjdbc://scott:tiger@127.0.0.1:5432/test
 mysql=mysql://scott:tiger@127.0.0.1:3306/test
-pymysql=mysql+pymysql://scott:tiger@127.0.0.1:3306/test?use_unicode=0&charset=utf8
+mssql=mssql+pyodbc://scott:tiger@ms_2005
+oursql=mysql+oursql://scott:tiger@127.0.0.1:3306/test
+pymysql=mysql+pymysql://scott:tiger@127.0.0.1:3306/test
 oracle=oracle://scott:tiger@127.0.0.1:1521
 oracle8=oracle://scott:tiger@127.0.0.1:1521/?use_ansi=0
 maxdb=maxdb://MONA:RED@/maxdb1