summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Smeaton <josh.smeaton@gmail.com>2015-02-10 10:54:51 +1100
committerShai Berger <shai@platonix.com>2015-02-10 23:42:16 +0200
commit3518d51697f1f2e0a516cd82dfc6e05f9f686dab (patch)
tree994ce149336ad098fd2d9abf2eeb5ee9cb07f96f
parent9b7b37382cb0e8b5e2d149a3102005bf62016ea3 (diff)
[1.8.x] Fixed #24200 -- Made introspection bypass statement cache
Backport of 1fbe8a2de3 from master
-rw-r--r--django/db/backends/oracle/features.py1
-rw-r--r--django/db/backends/oracle/introspection.py7
-rw-r--r--django/db/backends/oracle/schema.py3
-rw-r--r--docs/releases/1.8.txt4
4 files changed, 10 insertions, 5 deletions
diff --git a/django/db/backends/oracle/features.py b/django/db/backends/oracle/features.py
index 93c0beaf1e..80744d6e1c 100644
--- a/django/db/backends/oracle/features.py
+++ b/django/db/backends/oracle/features.py
@@ -34,7 +34,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
supports_combined_alters = False
nulls_order_largest = True
requires_literal_defaults = True
- connection_persists_old_columns = True
closed_cursor_error_class = InterfaceError
bare_select_suffix = " FROM DUAL"
uppercases_column_names = True
diff --git a/django/db/backends/oracle/introspection.py b/django/db/backends/oracle/introspection.py
index 3596368b6b..c058418ec3 100644
--- a/django/db/backends/oracle/introspection.py
+++ b/django/db/backends/oracle/introspection.py
@@ -33,6 +33,8 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
except AttributeError:
pass
+ cache_bust_counter = 1
+
def get_field_type(self, data_type, description):
# If it's a NUMBER with scale == 0, consider it an IntegerField
if data_type == cx_Oracle.NUMBER:
@@ -59,7 +61,10 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
def get_table_description(self, cursor, table_name):
"Returns a description of the table, with the DB-API cursor.description interface."
- cursor.execute("SELECT * FROM %s WHERE ROWNUM < 2" % self.connection.ops.quote_name(table_name))
+ self.cache_bust_counter += 1
+ cursor.execute("SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0".format(
+ self.connection.ops.quote_name(table_name),
+ self.cache_bust_counter))
description = []
for desc in cursor.description:
name = force_text(desc[0]) # cx_Oracle always returns a 'str' on both Python 2 and 3
diff --git a/django/db/backends/oracle/schema.py b/django/db/backends/oracle/schema.py
index fa710dc443..e4b02fcc7b 100644
--- a/django/db/backends/oracle/schema.py
+++ b/django/db/backends/oracle/schema.py
@@ -87,9 +87,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
self.remove_field(model, old_field)
# Rename the new field
self.alter_field(model, new_temp_field, new_field)
- # Close the connection to force cx_Oracle to get column types right
- # on a new cursor
- self.connection.close()
def normalize_name(self, name):
"""
diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt
index ac1dd36374..e24426d4c1 100644
--- a/docs/releases/1.8.txt
+++ b/docs/releases/1.8.txt
@@ -286,6 +286,10 @@ Database backends
* The MySQL backend no longer creates explicit indexes for foreign keys when
using the InnoDB storage engine, as MySQL already creates them automatically.
+* The Oracle backend no longer defines the ``connection_persists_old_columns``
+ feature as ``True``. Instead, Oracle will now include a cache busting clause
+ when getting the description of a table.
+
Email
^^^^^