]> 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:04:51 +0000 (12:04 -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
lib/sqlalchemy/sql/sqltypes.py
setup.cfg

index c159089e2a6fc06dbb12ffcc5a0b3e3cce0c5a5e..58804899b49ffacf935f0a1dc3a4fc016a39350f 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 33e59218bd1c868add1197d4c1e3bc464adee4ad..e4efb2201820e9233029cde15bfe92370c494ed6 100644 (file)
@@ -128,36 +128,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 74de09c4de9e3ce18cc9ea54de1fa56abc788bcf..7989203cfe81e0e8d3c0d24807a9031ba9e4654f 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 61d906e1c52222b98f4777930b8d8f2c6d73f651..fee424e659cb81ce2f5ddbfcd7a5e8f61a23aafc 100644 (file)
@@ -198,7 +198,6 @@ class String(Concatenable, TypeEngine):
                                 dialect.returns_unicode_strings and
                                 self.convert_unicode != 'force_nocheck'
                             )
-
         if needs_convert:
             to_unicode = processors.to_unicode_processor_factory(
                                     dialect.encoding, self.unicode_error)
index feaa1cdde7a1a47d2816064a2e69db8762b21d61..60236bdebd662dbbaaed4a3ebb1f1e3903f65096 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -37,7 +37,7 @@ mysql_jython=mysql+zxjdbc://scott:tiger@127.0.0.1:5432/test
 mysql=mysql://scott:tiger@127.0.0.1:3306/test
 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?use_unicode=0&charset=utf8
+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