Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

boulder-oracle-sprint: Fixed #4056: Added optional "tablespace" param…

…eter to Fields to specify a tablespace for the column's index in backends that support it, primarily for use in Oracle.

git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@5027 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 04af379c706e2515d0937c2b338219ddfde09c16 1 parent e076f10
Boulder Sprinters authored
View
35 django/core/management.py
@@ -178,6 +178,7 @@ def _get_sql_model_create(model, known_models=set()):
rel_field = f
data_type = f.get_internal_type()
col_type = data_types[data_type]
+ tablespace = f.tablespace or opts.tablespace
if col_type is not None:
# Make the definition (e.g. 'foo VARCHAR(30)') for this field.
field_output = [style.SQL_FIELD(backend.quote_name(f.column)),
@@ -187,6 +188,10 @@ def _get_sql_model_create(model, known_models=set()):
field_output.append(style.SQL_KEYWORD('UNIQUE'))
if f.primary_key:
field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
+ if tablespace and backend.supports_tablespaces and (f.unique or f.primary_key) and backend.autoindexes_primary_keys:
+ # We must specify the index tablespace inline, because we
+ # won't be generating a CREATE INDEX statement for this field.
+ field_output.append(backend.get_tablespace_sql(tablespace, inline=True))
if f.rel:
if f.rel.to in known_models:
field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \
@@ -212,7 +217,7 @@ def _get_sql_model_create(model, known_models=set()):
full_statement.append(' %s%s' % (line, i < len(table_output)-1 and ',' or ''))
full_statement.append(')')
if opts.tablespace and backend.supports_tablespaces:
- full_statement.append(backend.get_tablespace_sql() % backend.quote_name(opts.tablespace))
+ full_statement.append(backend.get_tablespace_sql(opts.tablespace))
full_statement.append(';')
final_output.append('\n'.join(full_statement))
@@ -261,12 +266,18 @@ def _get_many_to_many_sql_for_model(model):
final_output = []
for f in opts.many_to_many:
if not isinstance(f.rel, GenericRel):
+ tablespace = f.tablespace or opts.tablespace
+ if tablespace and backend.supports_tablespaces and backend.autoindexes_primary_keys:
+ tablespace_sql = ' ' + backend.get_tablespace_sql(tablespace, inline=True)
+ else:
+ tablespace_sql = ''
table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \
style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' (']
- table_output.append(' %s %s %s,' % \
+ table_output.append(' %s %s %s%s,' % \
(style.SQL_FIELD(backend.quote_name('id')),
style.SQL_COLTYPE(data_types['AutoField']),
- style.SQL_KEYWORD('NOT NULL PRIMARY KEY')))
+ style.SQL_KEYWORD('NOT NULL PRIMARY KEY'),
+ tablespace_sql))
table_output.append(' %s %s %s %s (%s)%s,' % \
(style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__),
@@ -281,13 +292,15 @@ def _get_many_to_many_sql_for_model(model):
style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)),
style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)),
backend.get_deferrable_sql()))
- table_output.append(' %s (%s, %s)' % \
+ table_output.append(' %s (%s, %s)%s' % \
(style.SQL_KEYWORD('UNIQUE'),
style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
- style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name()))))
+ style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())),
+ tablespace_sql))
table_output.append(')')
if opts.tablespace and backend.supports_tablespaces:
- table_output.append(backend.get_tablespace_sql() % opts.tablespace)
+ # f.tablespace is only for indices, so ignore its value here.
+ table_output.append(backend.get_tablespace_sql(opts.tablespace))
table_output.append(';')
final_output.append('\n'.join(table_output))
@@ -468,14 +481,20 @@ def get_sql_indexes_for_model(model):
output = []
for f in model._meta.fields:
- if f.db_index and not (f.primary_key and backend.autoindexes_primary_keys):
+ if f.db_index and not ((f.primary_key or f.unique) and backend.autoindexes_primary_keys):
unique = f.unique and 'UNIQUE ' or ''
+ tablespace = f.tablespace or model._meta.tablespace
+ if tablespace and backend.supports_tablespaces:
+ tablespace_sql = ' ' + backend.get_tablespace_sql(tablespace)
+ else:
+ tablespace_sql = ''
output.append(
style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
style.SQL_TABLE(backend.quote_name('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \
style.SQL_KEYWORD('ON') + ' ' + \
style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
- "(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
+ "(%s)" % style.SQL_FIELD(backend.quote_name(f.column)) + \
+ "%s;" % tablespace_sql
)
return output
View
4 django/db/backends/ado_mssql/base.py
@@ -154,8 +154,8 @@ def get_max_name_length():
def get_start_transaction_sql():
return "BEGIN;"
-def get_tablespace_sql():
- return "ON %s"
+def get_tablespace_sql(tablespace, inline=False):
+ return "ON %s" % quote_name(tablespace)
def get_autoinc_sql(table):
return None
View
5 django/db/backends/mysql/base.py
@@ -137,7 +137,7 @@ def get_server_version(self):
needs_datetime_string_cast = True # MySQLdb requires a typecast for dates
needs_upper_for_iops = False
supports_constraints = True
-supports_tablespaces = True
+supports_tablespaces = False
uses_case_insensitive_names = False
def quote_name(name):
@@ -201,9 +201,6 @@ def get_max_name_length():
def get_start_transaction_sql():
return "BEGIN;"
-def get_tablespace_sql():
- return "TABLESPACE %s STORAGE DISK"
-
def get_autoinc_sql(table):
return None
View
4 django/db/backends/oracle/base.py
@@ -169,8 +169,8 @@ def get_max_name_length():
def get_start_transaction_sql():
return None
-def get_tablespace_sql():
- return "TABLESPACE %s"
+def get_tablespace_sql(tablespace, inline=False):
+ return "%sTABLESPACE %s" % ((inline and "USING INDEX " or ""), quote_name(tablespace))
def get_autoinc_sql(table):
# To simulate auto-incrementing primary keys in Oracle, we have to
View
5 django/db/backends/postgresql/base.py
@@ -110,7 +110,7 @@ def close(self):
needs_datetime_string_cast = True
needs_upper_for_iops = False
supports_constraints = True
-supports_tablespaces = True
+supports_tablespaces = False
uses_case_insensitive_names = False
def quote_name(name):
@@ -174,9 +174,6 @@ def get_max_name_length():
def get_start_transaction_sql():
return "BEGIN;"
-def get_tablespace_sql():
- return "TABLESPACE %s"
-
def get_autoinc_sql(table):
return None
View
5 django/db/backends/postgresql_psycopg2/base.py
@@ -78,7 +78,7 @@ def close(self):
needs_datetime_string_cast = False
needs_upper_for_iops = False
supports_constraints = True
-supports_tablespaces = True
+supports_tablespaces = False
uses_case_insensitive_names = True
def quote_name(name):
@@ -134,9 +134,6 @@ def get_max_name_length():
def get_start_transaction_sql():
return "BEGIN;"
-def get_tablespace_sql():
- return "TABLESPACE %s"
-
def get_autoinc_sql(table):
return None
View
3  django/db/models/fields/__init__.py
@@ -70,7 +70,7 @@ def __init__(self, verbose_name=None, name=None, primary_key=False,
core=False, rel=None, default=NOT_PROVIDED, editable=True, serialize=True,
prepopulate_from=None, unique_for_date=None, unique_for_month=None,
unique_for_year=None, validator_list=None, choices=None, radio_admin=None,
- help_text='', db_column=None):
+ help_text='', db_column=None, tablespace=None):
self.name = name
self.verbose_name = verbose_name
self.primary_key = primary_key
@@ -87,6 +87,7 @@ def __init__(self, verbose_name=None, name=None, primary_key=False,
self.radio_admin = radio_admin
self.help_text = help_text
self.db_column = db_column
+ self.tablespace = tablespace
# Set db_index to True if the field has a relationship and doesn't explicitly set db_index.
self.db_index = db_index
Please sign in to comment.
Something went wrong with that request. Please try again.