summaryrefslogtreecommitdiff
path: root/django/db/backends/oracle/introspection.py
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2020-06-30 09:50:15 +0200
committerGitHub <noreply@github.com>2020-06-30 09:50:15 +0200
commit615e32162ff646db3456b90fb4eaaecc33dd3e4e (patch)
treee9798236fefd04963aa90e603b26ae46652524eb /django/db/backends/oracle/introspection.py
parenta93425a37f4defdb31d4ca96bb3bf6da21f0b5ce (diff)
downloaddjango-615e32162ff646db3456b90fb4eaaecc33dd3e4e.tar.gz
Fixed #31751 -- Fixed database introspection with cx_Oracle 8.
Diffstat (limited to 'django/db/backends/oracle/introspection.py')
-rw-r--r--django/db/backends/oracle/introspection.py51
1 files changed, 35 insertions, 16 deletions
diff --git a/django/db/backends/oracle/introspection.py b/django/db/backends/oracle/introspection.py
index 3fab497b2a..41ffb68afb 100644
--- a/django/db/backends/oracle/introspection.py
+++ b/django/db/backends/oracle/introspection.py
@@ -6,29 +6,48 @@ from django.db import models
from django.db.backends.base.introspection import (
BaseDatabaseIntrospection, FieldInfo as BaseFieldInfo, TableInfo,
)
+from django.utils.functional import cached_property
FieldInfo = namedtuple('FieldInfo', BaseFieldInfo._fields + ('is_autofield', 'is_json'))
class DatabaseIntrospection(BaseDatabaseIntrospection):
- # Maps type objects to Django Field types.
- data_types_reverse = {
- cx_Oracle.BLOB: 'BinaryField',
- cx_Oracle.CLOB: 'TextField',
- cx_Oracle.DATETIME: 'DateField',
- cx_Oracle.FIXED_CHAR: 'CharField',
- cx_Oracle.FIXED_NCHAR: 'CharField',
- cx_Oracle.INTERVAL: 'DurationField',
- cx_Oracle.NATIVE_FLOAT: 'FloatField',
- cx_Oracle.NCHAR: 'CharField',
- cx_Oracle.NCLOB: 'TextField',
- cx_Oracle.NUMBER: 'DecimalField',
- cx_Oracle.STRING: 'CharField',
- cx_Oracle.TIMESTAMP: 'DateTimeField',
- }
-
cache_bust_counter = 1
+ # Maps type objects to Django Field types.
+ @cached_property
+ def data_types_reverse(self):
+ if self.connection.cx_oracle_version < (8,):
+ return {
+ cx_Oracle.BLOB: 'BinaryField',
+ cx_Oracle.CLOB: 'TextField',
+ cx_Oracle.DATETIME: 'DateField',
+ cx_Oracle.FIXED_CHAR: 'CharField',
+ cx_Oracle.FIXED_NCHAR: 'CharField',
+ cx_Oracle.INTERVAL: 'DurationField',
+ cx_Oracle.NATIVE_FLOAT: 'FloatField',
+ cx_Oracle.NCHAR: 'CharField',
+ cx_Oracle.NCLOB: 'TextField',
+ cx_Oracle.NUMBER: 'DecimalField',
+ cx_Oracle.STRING: 'CharField',
+ cx_Oracle.TIMESTAMP: 'DateTimeField',
+ }
+ else:
+ return {
+ cx_Oracle.DB_TYPE_DATE: 'DateField',
+ cx_Oracle.DB_TYPE_BINARY_DOUBLE: 'FloatField',
+ cx_Oracle.DB_TYPE_BLOB: 'BinaryField',
+ cx_Oracle.DB_TYPE_CHAR: 'CharField',
+ cx_Oracle.DB_TYPE_CLOB: 'TextField',
+ cx_Oracle.DB_TYPE_INTERVAL_DS: 'DurationField',
+ cx_Oracle.DB_TYPE_NCHAR: 'CharField',
+ cx_Oracle.DB_TYPE_NCLOB: 'TextField',
+ cx_Oracle.DB_TYPE_NVARCHAR: 'CharField',
+ cx_Oracle.DB_TYPE_NUMBER: 'DecimalField',
+ cx_Oracle.DB_TYPE_TIMESTAMP: 'DateTimeField',
+ cx_Oracle.DB_TYPE_VARCHAR: 'CharField',
+ }
+
def get_field_type(self, data_type, description):
if data_type == cx_Oracle.NUMBER:
precision, scale = description[4:6]