diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-06-13 17:48:51 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-09-22 21:34:32 -0400 |
| commit | fb991a4474fa0d4df69af10a808fe234016c6a52 (patch) | |
| tree | c4243c5a6f8f45b163adb87fc393d11dbed38bb2 /lib/sqlalchemy/dialects/oracle/base.py | |
| parent | a4da6452c35daaa057acb895206b9104c2b70ac4 (diff) | |
| download | sqlalchemy-fb991a4474fa0d4df69af10a808fe234016c6a52.tar.gz | |
Add use_nchar_for_unicode flag; don't use nchar types for generic unicode
The Oracle dialect will no longer use the NCHAR/NCLOB datatypes to
represent generic unicode strings or clob fields in conjunction with
:class:`.Unicode` and :class:`.UnicodeText` unless the flag
``use_nchar_for_unicode=True`` is passed to :func:`.create_engine`.
Additionally, string types under Oracle now coerce to unicode under Python
2 in all cases, however unlike in previous iterations, we use SQLAlchemy's
native unicode handlers which are very performant (when C extensions are
enabled; when they are not, we use cx_Oracle's handlers).
Change-Id: I3939012e9396520875bc52e69bf81f27393836ee
Fixes: #4242
Diffstat (limited to 'lib/sqlalchemy/dialects/oracle/base.py')
| -rw-r--r-- | lib/sqlalchemy/dialects/oracle/base.py | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index 76ae1ced6..b5aea4386 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -533,7 +533,7 @@ class OracleTypeCompiler(compiler.GenericTypeCompiler): return self.visit_FLOAT(type_, **kw) def visit_unicode(self, type_, **kw): - if self.dialect._supports_nchar: + if self.dialect._use_nchar_for_unicode: return self.visit_NVARCHAR2(type_, **kw) else: return self.visit_VARCHAR2(type_, **kw) @@ -620,7 +620,7 @@ class OracleTypeCompiler(compiler.GenericTypeCompiler): return self.visit_CLOB(type_, **kw) def visit_unicode_text(self, type_, **kw): - if self.dialect._supports_nchar: + if self.dialect._use_nchar_for_unicode: return self.visit_NCLOB(type_, **kw) else: return self.visit_CLOB(type_, **kw) @@ -1056,6 +1056,8 @@ class OracleDialect(default.DefaultDialect): reflection_options = ('oracle_resolve_synonyms', ) + _use_nchar_for_unicode = False + construct_arguments = [ (sa_schema.Table, { "resolve_synonyms": False, @@ -1072,9 +1074,11 @@ class OracleDialect(default.DefaultDialect): use_ansi=True, optimize_limits=False, use_binds_for_limits=True, + use_nchar_for_unicode=False, exclude_tablespaces=('SYSTEM', 'SYSAUX', ), **kwargs): default.DefaultDialect.__init__(self, **kwargs) + self._use_nchar_for_unicode = use_nchar_for_unicode self.use_ansi = use_ansi self.optimize_limits = optimize_limits self.use_binds_for_limits = use_binds_for_limits @@ -1111,14 +1115,20 @@ class OracleDialect(default.DefaultDialect): def _supports_char_length(self): return not self._is_oracle_8 - @property - def _supports_nchar(self): - return not self._is_oracle_8 - def do_release_savepoint(self, connection, name): # Oracle does not support RELEASE SAVEPOINT pass + def _check_unicode_returns(self, connection): + additional_tests = [ + expression.cast( + expression.literal_column("'test nvarchar2 returns'"), + sqltypes.NVARCHAR(60) + ), + ] + return super(OracleDialect, self)._check_unicode_returns( + connection, additional_tests) + def has_table(self, connection, table_name, schema=None): if not schema: schema = self.default_schema_name |
