summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/oracle/base.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-06-13 17:48:51 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2018-09-22 21:34:32 -0400
commitfb991a4474fa0d4df69af10a808fe234016c6a52 (patch)
treec4243c5a6f8f45b163adb87fc393d11dbed38bb2 /lib/sqlalchemy/dialects/oracle/base.py
parenta4da6452c35daaa057acb895206b9104c2b70ac4 (diff)
downloadsqlalchemy-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.py22
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