summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-01-11 13:12:40 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2014-01-11 13:12:40 -0500
commit2775c95b1ee30831216cc558ceb88aa8f8353dbe (patch)
tree4e292a2afbafb0abd86e4e16a6a21e433722ef6a
parent1d4f0df35dd7232258670101bca426ec0a5d5c56 (diff)
downloadsqlalchemy-2775c95b1ee30831216cc558ceb88aa8f8353dbe.tar.gz
new changelog
-rw-r--r--doc/build/requirements.txt2
-rw-r--r--lib/sqlalchemy/connectors/mysqldb.py12
-rw-r--r--lib/sqlalchemy/engine/default.py51
-rw-r--r--test/engine/test_execute.py2
4 files changed, 44 insertions, 23 deletions
diff --git a/doc/build/requirements.txt b/doc/build/requirements.txt
index 8b98c8e45..6e2354f07 100644
--- a/doc/build/requirements.txt
+++ b/doc/build/requirements.txt
@@ -1,3 +1,3 @@
mako
-changelog>=0.3.2
+changelog>=0.3.4
sphinx-paramlinks>=0.2.0
diff --git a/lib/sqlalchemy/connectors/mysqldb.py b/lib/sqlalchemy/connectors/mysqldb.py
index 0f250dfdb..0a752b87e 100644
--- a/lib/sqlalchemy/connectors/mysqldb.py
+++ b/lib/sqlalchemy/connectors/mysqldb.py
@@ -62,6 +62,18 @@ class MySQLDBConnector(Connector):
# is overridden when pymysql is used
return __import__('MySQLdb')
+ def _check_unicode_returns(self, connection):
+ # work around issue fixed in
+ # https://github.com/farcepest/MySQLdb1/commit/cd44524fef63bd3fcb71947392326e9742d520e8
+ # unicode charset fails for a table with
+ additional_tests = [
+ sql.collate(sql.cast(
+ sql.literal_column(
+ "'test collated returns'"),
+ sqltypes.TEXT), 'utf8_bin')
+ ]
+ return super(MySQLDBConnector, self)._check_unicode_returns(connection, additional_tests)
+
def do_executemany(self, cursor, statement, parameters, context=None):
rowcount = cursor.executemany(statement, parameters)
if context is not None:
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py
index 509d772aa..bcb9960b1 100644
--- a/lib/sqlalchemy/engine/default.py
+++ b/lib/sqlalchemy/engine/default.py
@@ -228,46 +228,55 @@ class DefaultDialect(interfaces.Dialect):
"""
return None
- def _check_unicode_returns(self, connection):
+ def _check_unicode_returns(self, connection, additional_tests=None):
if util.py2k and not self.supports_unicode_statements:
cast_to = util.binary_type
else:
cast_to = util.text_type
- def check_unicode(formatstr, type_):
+ if self.positional:
+ parameters = self.execute_sequence_format()
+ else:
+ parameters = {}
+
+ def check_unicode(test):
cursor = connection.connection.cursor()
try:
try:
- cursor.execute(
- cast_to(
- expression.select(
- [expression.cast(
- expression.literal_column(
- "'test %s returns'" % formatstr),
- type_)
- ]).compile(dialect=self)
- )
- )
+ statement = cast_to(expression.select([test]).compile(dialect=self))
+ connection._cursor_execute(cursor, statement, parameters)
row = cursor.fetchone()
return isinstance(row[0], util.text_type)
- except self.dbapi.Error as de:
+ except exc.DBAPIError as de:
util.warn("Exception attempting to "
"detect unicode returns: %r" % de)
return False
finally:
cursor.close()
- # detect plain VARCHAR
- unicode_for_varchar = check_unicode("plain", sqltypes.VARCHAR(60))
-
- # detect if there's an NVARCHAR type with different behavior available
- unicode_for_unicode = check_unicode("unicode", sqltypes.Unicode(60))
-
- if unicode_for_unicode and not unicode_for_varchar:
+ tests = [
+ # detect plain VARCHAR
+ expression.cast(
+ expression.literal_column("'test plain returns'"),
+ sqltypes.VARCHAR(60)
+ ),
+ # detect if there's an NVARCHAR type with different behavior available
+ expression.cast(
+ expression.literal_column("'test unicode returns'"),
+ sqltypes.Unicode(60)
+ ),
+ ]
+
+ if additional_tests:
+ tests += additional_tests
+
+ results = set([check_unicode(test) for test in tests])
+
+ if results.issuperset([True, False]):
return "conditional"
else:
- return unicode_for_varchar
+ return results == set([True])
def _check_unicode_description(self, connection):
# all DBAPIs on Py2K return cursor.description as encoded,
diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py
index c2479eff7..d3bd3c2cd 100644
--- a/test/engine/test_execute.py
+++ b/test/engine/test_execute.py
@@ -1050,7 +1050,7 @@ class ResultProxyTest(fixtures.TestBase):
class ExecutionOptionsTest(fixtures.TestBase):
def test_dialect_conn_options(self):
- engine = testing_engine("sqlite://")
+ engine = testing_engine("sqlite://", options=dict(_initialize=False))
engine.dialect = Mock()
conn = engine.connect()
c2 = conn.execution_options(foo="bar")