Ticket #5858: sql_generation_required.diff

File sql_generation_required.diff, 5.9 KB (added by honeyman, 17 years ago)

sql_generation_required implementation (diff -urN, Django 0.9.6)

  • core/management.py

    diff -urN django-0.9.6/core/management.py django/core/management.py
    old new  
    206206    for i, line in enumerate(table_output): # Combine and add commas.
    207207        full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
    208208    full_statement.append(');')
    209     final_output.append('\n'.join(full_statement))
     209    if opts.sql_generation_required:
     210        final_output.append('\n'.join(full_statement))
    210211
    211212    return final_output, pending_references
    212213
     
    230231                # For MySQL, r_name must be unique in the first 64 characters.
    231232                # So we are careful with character usage here.
    232233                r_name = '%s_refs_%s_%x' % (r_col, col, abs(hash((r_table, table))))
    233                 final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \
    234                     (backend.quote_name(r_table), r_name,
    235                     backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col),
    236                     backend.get_deferrable_sql()))
     234                if rel_opts.sql_generation_required:
     235                    final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \
     236                        (backend.quote_name(r_table), r_name,
     237                        backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col),
     238                        backend.get_deferrable_sql()))
    237239            del pending_references[model]
    238240    return final_output
    239241
     
    312314    for model in app_models:
    313315        if cursor and model._meta.db_table in table_names:
    314316            # Drop the table now
    315             output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
    316                 style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
     317            if model._meta.sql_generation_required:
     318                output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
     319                    style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
    317320            if backend.supports_constraints and references_to_delete.has_key(model):
    318321                for rel_class, f in references_to_delete[model]:
    319322                    table = rel_class._meta.db_table
    320323                    col = f.column
    321324                    r_table = model._meta.db_table
    322325                    r_col = model._meta.get_field(f.rel.field_name).column
    323                     output.append('%s %s %s %s;' % \
    324                         (style.SQL_KEYWORD('ALTER TABLE'),
    325                         style.SQL_TABLE(backend.quote_name(table)),
    326                         style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()),
    327                         style.SQL_FIELD(backend.quote_name('%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table))))))))
     326                    if rel_class._meta.sql_generation_required:
     327                        output.append('%s %s %s %s;' % \
     328                            (style.SQL_KEYWORD('ALTER TABLE'),
     329                            style.SQL_TABLE(backend.quote_name(table)),
     330                            style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()),
     331                            style.SQL_FIELD(backend.quote_name('%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table))))))))
    328332                del references_to_delete[model]
    329333
    330334    # Output DROP TABLE statements for many-to-many tables.
     
    451455    from django.db import backend
    452456    output = []
    453457
    454     for f in model._meta.fields:
    455         if f.db_index:
    456             unique = f.unique and 'UNIQUE ' or ''
    457             output.append(
    458                 style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
    459                 style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \
    460                 style.SQL_KEYWORD('ON') + ' ' + \
    461                 style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
    462                 "(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
     458    if model._meta.sql_generation_required:
     459        for f in model._meta.fields:
     460            if f.db_index:
     461                unique = f.unique and 'UNIQUE ' or ''
     462                output.append(
     463                    style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
     464                    style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \
     465                    style.SQL_KEYWORD('ON') + ' ' + \
     466                    style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
     467                    "(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
    463468            )
    464469    return output
    465470
  • db/models/options.py

    diff -urN django-0.9.6/db/models/options.py django/db/models/options.py
    old new  
    1313
    1414DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
    1515                 'unique_together', 'permissions', 'get_latest_by',
    16                  'order_with_respect_to', 'app_label')
     16                 'order_with_respect_to', 'app_label', 'sql_generation_required')
    1717
    1818class Options(object):
    1919    def __init__(self, meta):
     
    2525        self.unique_together =  []
    2626        self.permissions =  []
    2727        self.object_name, self.app_label = None, None
     28        self.sql_generation_required = True
    2829        self.get_latest_by = None
    2930        self.order_with_respect_to = None
    3031        self.admin = None
     
    8889
    8990    def __repr__(self):
    9091        return '<Options for %s>' % self.object_name
    91        
     92
    9293    def __str__(self):
    9394        return "%s.%s" % (self.app_label, self.module_name)
    94        
     95
    9596    def get_field(self, name, many_to_many=True):
    9697        "Returns the requested field by name. Raises FieldDoesNotExist on error."
    9798        to_search = many_to_many and (self.fields + self.many_to_many) or self.fields
Back to Top