From: Mike Bayer Date: Sun, 27 Mar 2011 23:39:39 +0000 (-0400) Subject: - Using column names that would require quotes X-Git-Tag: rel_0_7b4~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=545b70e8a2bcc3803f0a72cc4a50c1b40a4a3eba;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Using column names that would require quotes for the column itself or for a name-generated bind parameter, such as names with special characters, underscores, non-ascii characters, now properly translate bind parameter keys when talking to cx_oracle. [ticket:2100] (Also in 0.6.7) --- diff --git a/CHANGES b/CHANGES index 4654016e4e..15c0708701 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,15 @@ CHANGES collection of Sequence objects, list of schema names. [ticket:2104] +- oracle + - Using column names that would require quotes + for the column itself or for a name-generated + bind parameter, such as names with special + characters, underscores, non-ascii characters, + now properly translate bind parameter keys when + talking to cx_oracle. [ticket:2100] (Also + in 0.6.7) + 0.7.0b3 ======= - general diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index b00adcd632..a917aac021 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -294,10 +294,15 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): quoted_bind_names = \ getattr(self.compiled, '_quoted_bind_names', None) if quoted_bind_names: - if not self.dialect.supports_unicode_binds: + if not self.dialect.supports_unicode_statements: + # if DBAPI doesn't accept unicode statements, + # keys in self.parameters would have been encoded + # here. so convert names in quoted_bind_names + # to encoded as well. quoted_bind_names = \ dict( - (fromname, toname.encode(self.dialect.encoding)) + (fromname.encode(self.dialect.encoding), + toname.encode(self.dialect.encoding)) for fromname, toname in quoted_bind_names.items() ) diff --git a/test/dialect/test_oracle.py b/test/dialect/test_oracle.py index 994f500e14..26e46349ea 100644 --- a/test/dialect/test_oracle.py +++ b/test/dialect/test_oracle.py @@ -1323,3 +1323,39 @@ class ExecuteTest(fixtures.TestBase): ) +class UnicodeSchemaTest(fixtures.TestBase): + __only_on__ = 'oracle' + + @testing.provide_metadata + def test_quoted_column_non_unicode(self): + metadata = self.metadata + table=Table("atable", metadata, + Column("_underscorecolumn", Unicode(255), primary_key=True), + ) + metadata.create_all() + + table.insert().execute( + {'_underscorecolumn': u'’é'}, + ) + result = testing.db.execute( + table.select().where(table.c._underscorecolumn==u'’é') + ).scalar() + eq_(result, u'’é') + + @testing.provide_metadata + def test_quoted_column_unicode(self): + metadata = self.metadata + table=Table("atable", metadata, + Column(u"méil", Unicode(255), primary_key=True), + ) + metadata.create_all() + + table.insert().execute( + {u'méil': u'’é'}, + ) + result = testing.db.execute( + table.select().where(table.c[u'méil']==u'’é') + ).scalar() + eq_(result, u'’é') + +