From 8598780e8d746a85897ab19bd514c9980bfe446e Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 28 Dec 2008 22:32:04 +0000 Subject: [PATCH] - Added OracleNVarchar type, produces NVARCHAR2, and also subclasses Unicode so that convert_unicode=True by default. NVARCHAR2 reflects into this type automatically so these columns pass unicode on a reflected table with no explicit convert_unicode=True flags. [ticket:1233] --- CHANGES | 6 ++++++ lib/sqlalchemy/databases/oracle.py | 7 ++++++- test/dialect/oracle.py | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 082e9e7b2b..6d34b8e081 100644 --- a/CHANGES +++ b/CHANGES @@ -303,6 +303,12 @@ CHANGES of Oracle two-phase commit working properly with this change. + - Added OracleNVarchar type, produces NVARCHAR2, and also + subclasses Unicode so that convert_unicode=True by default. + NVARCHAR2 reflects into this type automatically so + these columns pass unicode on a reflected table with no explicit + convert_unicode=True flags. [ticket:1233] + - mysql - Fixed bug in exception raise when FK columns not present during reflection. [ticket:1241] diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index aed070f2e5..5a305ffd2b 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -202,6 +202,10 @@ class OracleString(sqltypes.String): def get_col_spec(self): return "VARCHAR(%(length)s)" % {'length' : self.length} +class OracleNVarchar(sqltypes.Unicode, OracleString): + def get_col_spec(self): + return "NVARCHAR2(%(length)s)" % {'length' : self.length} + class OracleText(sqltypes.Text): def get_dbapi_type(self, dbapi): return dbapi.CLOB @@ -297,6 +301,7 @@ colspecs = { ischema_names = { 'VARCHAR2' : OracleString, + 'NVARCHAR2' : OracleNVarchar, 'CHAR' : OracleString, 'DATE' : OracleDateTime, 'DATETIME' : OracleDateTime, @@ -888,4 +893,4 @@ dialect.schemagenerator = OracleSchemaGenerator dialect.schemadropper = OracleSchemaDropper dialect.preparer = OracleIdentifierPreparer dialect.defaultrunner = OracleDefaultRunner -dialect.execution_ctx_cls = OracleExecutionContext \ No newline at end of file +dialect.execution_ctx_cls = OracleExecutionContext diff --git a/test/dialect/oracle.py b/test/dialect/oracle.py index 611e4bc509..3eaba8fb3c 100644 --- a/test/dialect/oracle.py +++ b/test/dialect/oracle.py @@ -1,3 +1,5 @@ +# coding: utf-8 + import testenv; testenv.configure_for_tests() from sqlalchemy import * from sqlalchemy.sql import table, column @@ -296,6 +298,22 @@ class TypesTest(TestBase, AssertsCompiledSQL): ) [[row[k] for k in row.keys()] for row in types_table.select().execute().fetchall()] + def test_reflect_nvarchar(self): + metadata = MetaData(testing.db) + t = Table('t', metadata, + Column('data', oracle.OracleNVarchar(255)) + ) + metadata.create_all() + try: + m2 = MetaData(testing.db) + t2 = Table('t', m2, autoload=True) + assert isinstance(t2.c.data.type, oracle.OracleNVarchar) + data = u'm’a réveillé.' + t2.insert().execute(data=data) + eq_(t2.select().execute().fetchone()['data'], data) + finally: + metadata.drop_all() + def test_longstring(self): metadata = MetaData(testing.db) testing.db.execute(""" -- 2.47.3