Django

Code

Changeset 7790

Show
Ignore:
Timestamp:
06/29/08 23:46:59 (2 months ago)
Author:
mtredinnick
Message:

Make sure we only create the minimum number of table indexes for MySQL.

This patch simplifies a bunch of code for all backends and removes some
duplicate index creation for MySQL, in particular (versions 4.x and later).
Patch from Nis Jørgensen.

Fixed #5671, #5680, #7170, #7186.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/AUTHORS

    r7762 r7790  
    193193    jcrasta@gmail.com 
    194194    Zak Johnson <zakj@nox.cx> 
     195    Nis Jørgensen <nis@superlativ.dk> 
    195196    Michael Josephson <http://www.sdjournal.com/> 
    196197    jpellerin@gmail.com 
  • django/trunk/django/core/management/commands/createcachetable.py

    r7294 r7790  
    2222            field_output = [qn(f.name), f.db_type()] 
    2323            field_output.append("%sNULL" % (not f.null and "NOT " or "")) 
    24             if f.unique: 
    25                 field_output.append("UNIQUE") 
    2624            if f.primary_key: 
    2725                field_output.append("PRIMARY KEY") 
     26            elif f.unique: 
     27                field_output.append("UNIQUE") 
    2828            if f.db_index: 
    2929                unique = f.unique and "UNIQUE " or "" 
  • django/trunk/django/core/management/sql.py

    r7591 r7790  
    269269            style.SQL_COLTYPE(col_type)] 
    270270        field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or ''))) 
    271         if f.unique and (not f.primary_key or connection.features.allows_unique_and_pk): 
    272             field_output.append(style.SQL_KEYWORD('UNIQUE')) 
    273271        if f.primary_key: 
    274272            field_output.append(style.SQL_KEYWORD('PRIMARY KEY')) 
    275         if tablespace and connection.features.supports_tablespaces and (f.unique or f.primary_key) and connection.features.autoindexes_primary_keys: 
     273        elif f.unique: 
     274            field_output.append(style.SQL_KEYWORD('UNIQUE')) 
     275        if tablespace and connection.features.supports_tablespaces and f.unique: 
    276276            # We must specify the index tablespace inline, because we 
    277277            # won't be generating a CREATE INDEX statement for this field. 
     
    356356        if not isinstance(f.rel, generic.GenericRel): 
    357357            tablespace = f.db_tablespace or opts.db_tablespace 
    358             if tablespace and connection.features.supports_tablespaces and connection.features.autoindexes_primary_keys: 
     358            if tablespace and connection.features.supports_tablespaces:  
    359359                tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace, inline=True) 
    360360            else: 
     
    461461    qn = connection.ops.quote_name 
    462462    for f in model._meta.local_fields: 
    463         if f.db_index and not ((f.primary_key or f.unique) and connection.features.autoindexes_primary_keys): 
    464             unique = f.unique and 'UNIQUE ' or '' 
     463        if f.db_index and not f.unique: 
    465464            tablespace = f.db_tablespace or model._meta.db_tablespace 
    466465            if tablespace and connection.features.supports_tablespaces: 
     
    469468                tablespace_sql = '' 
    470469            output.append( 
    471                 style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \ 
     470                style.SQL_KEYWORD('CREATE INDEX') + ' ' + \ 
    472471                style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \ 
    473472                style.SQL_KEYWORD('ON') + ' ' + \ 
  • django/trunk/django/db/backends/__init__.py

    r7747 r7790  
    4242class BaseDatabaseFeatures(object): 
    4343    allows_group_by_ordinal = True 
    44     allows_unique_and_pk = True 
    45     autoindexes_primary_keys = True 
    4644    inline_fk_references = True 
    4745    needs_datetime_string_cast = True 
  • django/trunk/django/db/backends/mysql/base.py

    r7643 r7790  
    6161 
    6262class DatabaseFeatures(BaseDatabaseFeatures): 
    63     autoindexes_primary_keys = False 
    6463    inline_fk_references = False 
    6564    empty_fetchmany_value = () 
  • django/trunk/django/db/backends/mysql_old/base.py

    r7643 r7790  
    6565 
    6666class DatabaseFeatures(BaseDatabaseFeatures): 
    67     autoindexes_primary_keys = False 
    6867    inline_fk_references = False 
    6968    empty_fetchmany_value = () 
  • django/trunk/django/db/backends/oracle/base.py

    r7747 r7790  
    2525class DatabaseFeatures(BaseDatabaseFeatures): 
    2626    allows_group_by_ordinal = False 
    27     allows_unique_and_pk = False        # Suppress UNIQUE/PK for Oracle (ORA-02259) 
    2827    empty_fetchmany_value = () 
    2928    needs_datetime_string_cast = False 
  • django/trunk/django/db/models/fields/__init__.py

    r7743 r7790  
    9292        self.verbose_name = verbose_name 
    9393        self.primary_key = primary_key 
    94         self.max_length, self.unique = max_length, unique 
     94        self.max_length, self._unique = max_length, unique 
    9595        self.blank, self.null = blank, null 
    9696        # Oracle treats the empty string ('') as null, so coerce the null 
     
    168168        except KeyError: 
    169169            return None 
     170 
     171    def unique(self): 
     172        return self._unique or self.primary_key 
     173    unique = property(unique) 
    170174 
    171175    def validate_full(self, field_data, all_data):