Fixed #24200 -- Made introspection bypass statement cache

This commit is contained in:
Josh Smeaton 2015-02-10 10:54:51 +11:00 committed by Shai Berger
parent 1b8af4cfa0
commit 1fbe8a2de3
4 changed files with 10 additions and 5 deletions

View File

@ -35,7 +35,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
supports_combined_alters = False supports_combined_alters = False
nulls_order_largest = True nulls_order_largest = True
requires_literal_defaults = True requires_literal_defaults = True
connection_persists_old_columns = True
closed_cursor_error_class = InterfaceError closed_cursor_error_class = InterfaceError
bare_select_suffix = " FROM DUAL" bare_select_suffix = " FROM DUAL"
uppercases_column_names = True uppercases_column_names = True

View File

@ -33,6 +33,8 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
except AttributeError: except AttributeError:
pass pass
cache_bust_counter = 1
def get_field_type(self, data_type, description): def get_field_type(self, data_type, description):
# If it's a NUMBER with scale == 0, consider it an IntegerField # If it's a NUMBER with scale == 0, consider it an IntegerField
if data_type == cx_Oracle.NUMBER: if data_type == cx_Oracle.NUMBER:
@ -59,7 +61,10 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
def get_table_description(self, cursor, table_name): def get_table_description(self, cursor, table_name):
"Returns a description of the table, with the DB-API cursor.description interface." "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 = [] description = []
for desc in cursor.description: for desc in cursor.description:
name = force_text(desc[0]) # cx_Oracle always returns a 'str' on both Python 2 and 3 name = force_text(desc[0]) # cx_Oracle always returns a 'str' on both Python 2 and 3

View File

@ -87,9 +87,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
self.remove_field(model, old_field) self.remove_field(model, old_field)
# Rename the new field # Rename the new field
self.alter_field(model, new_temp_field, 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): def normalize_name(self, name):
""" """

View File

@ -286,6 +286,10 @@ Database backends
* The MySQL backend no longer creates explicit indexes for foreign keys when * The MySQL backend no longer creates explicit indexes for foreign keys when
using the InnoDB storage engine, as MySQL already creates them automatically. 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 Email
^^^^^ ^^^^^