From: Mike Bayer Date: Mon, 14 Jul 2014 22:54:23 +0000 (-0400) Subject: - In the SQL Server pyodbc dialect, repaired the implementation X-Git-Tag: rel_0_8_7~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a81d3a23c0052ae97e7cd05f6a6a6de5902164be;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - In the SQL Server pyodbc dialect, repaired the implementation for the ``description_encoding`` dialect parameter, which when not explicitly set was preventing cursor.description from being parsed correctly in the case of result sets that contained names in alternate encodings. This parameter shouldn't be needed going forward. fixes #3091 Conflicts: test/sql/test_unicode.py --- diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 6ef185b72f..2d5ea0cbff 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -11,6 +11,18 @@ .. changelog:: :version: 0.8.7 + .. change:: + :tags: bug, mssql + :versions: 1.0.0, 0.9.7 + :tickets: 3091 + + In the SQL Server pyodbc dialect, repaired the implementation + for the ``description_encoding`` dialect parameter, which when + not explicitly set was preventing cursor.description from + being parsed correctly in the case of result sets that + contained names in alternate encodings. This parameter + shouldn't be needed going forward. + .. change:: :tags: bug, sql :versions: 1.0.0, 0.9.7 diff --git a/lib/sqlalchemy/dialects/mssql/pyodbc.py b/lib/sqlalchemy/dialects/mssql/pyodbc.py index 6d5c8c00da..1a17f5ecc9 100644 --- a/lib/sqlalchemy/dialects/mssql/pyodbc.py +++ b/lib/sqlalchemy/dialects/mssql/pyodbc.py @@ -249,8 +249,9 @@ class MSDialect_pyodbc(PyODBCConnector, MSDialect): ) def __init__(self, description_encoding=None, **params): + if 'description_encoding' in params: + self.description_encoding = params.pop('description_encoding') super(MSDialect_pyodbc, self).__init__(**params) - self.description_encoding = description_encoding self.use_scope_identity = self.use_scope_identity and \ self.dbapi and \ hasattr(self.dbapi.Cursor, 'nextset') diff --git a/test/sql/test_unicode.py b/test/sql/test_unicode.py index 8cd9fdc277..4cf8222029 100644 --- a/test/sql/test_unicode.py +++ b/test/sql/test_unicode.py @@ -86,6 +86,29 @@ class UnicodeSchemaTest(fixtures.TestBase): assert t2.select().execute().fetchall() == [(1, 1)] assert t3.select().execute().fetchall() == [(1, 5, 1, 1)] + def test_col_targeting(self): + t1.insert().execute({u'méil': 1, u'\u6e2c\u8a66': 5}) + t2.insert().execute({u'a': 1, u'b': 1}) + t3.insert().execute({u'\u6e2c\u8a66_id': 1, + u'unitable1_\u6e2c\u8a66': 5, + u'Unitéble2_b': 1, + u'\u6e2c\u8a66_self': 1}) + + row = t1.select().execute().first() + eq_(row[t1.c[u'méil']], 1) + eq_(row[t1.c[u'\u6e2c\u8a66']], 5) + + row = t2.select().execute().first() + eq_(row[t2.c[u'a']], 1) + eq_(row[t2.c[u'b']], 1) + + row = t3.select().execute().first() + eq_(row[t3.c[u'\u6e2c\u8a66_id']], 1) + eq_(row[t3.c[u'unitable1_\u6e2c\u8a66']], 5) + eq_(row[t3.c[u'Unitéble2_b']], 1) + eq_(row[t3.c[u'\u6e2c\u8a66_self']], 1) + + @testing.skip_if(lambda: util.pypy, "pypy/sqlite3 reports unicode cursor.description " "incorrectly pre 2.2, workaround applied in 0.9")