Removed unnecessary looping in sqlite3 SchemaEditor.

This commit is contained in:
akki 2016-07-18 18:17:30 +05:30 committed by Tim Graham
parent bdba0fc195
commit 767849b765
2 changed files with 21 additions and 19 deletions

View File

@ -115,7 +115,7 @@ class SpatialiteSchemaEditor(DatabaseSchemaEditor):
# do not have a db type cause they are added and removed via stored # do not have a db type cause they are added and removed via stored
# procedures. # procedures.
if isinstance(field, GeometryField): if isinstance(field, GeometryField):
self._remake_table(model, delete_fields=[field]) self._remake_table(model, delete_field=field)
else: else:
super(SpatialiteSchemaEditor, self).remove_field(model, field) super(SpatialiteSchemaEditor, self).remove_field(model, field)

View File

@ -67,7 +67,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
else: else:
raise ValueError("Cannot quote parameter value %r of type %s" % (value, type(value))) raise ValueError("Cannot quote parameter value %r of type %s" % (value, type(value)))
def _remake_table(self, model, create_fields=[], delete_fields=[], alter_fields=[]): def _remake_table(self, model, create_field=None, delete_field=None, alter_field=None):
""" """
Shortcut to transform a model from old_model into new_model Shortcut to transform a model from old_model into new_model
@ -95,7 +95,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
# If any of the new or altered fields is introducing a new PK, # If any of the new or altered fields is introducing a new PK,
# remove the old one # remove the old one
restore_pk_field = None restore_pk_field = None
if any(f.primary_key for f in create_fields) or any(n.primary_key for o, n in alter_fields): if getattr(create_field, 'primary_key', False) or (
alter_field and getattr(alter_field[1], 'primary_key', False)):
for name, field in list(body.items()): for name, field in list(body.items()):
if field.primary_key: if field.primary_key:
field.primary_key = False field.primary_key = False
@ -104,15 +105,16 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
del body[name] del body[name]
del mapping[field.column] del mapping[field.column]
# Add in any created fields # Add in any created fields
for field in create_fields: if create_field:
body[field.name] = field body[create_field.name] = create_field
# Choose a default and insert it into the copy map # Choose a default and insert it into the copy map
if not field.many_to_many and field.concrete: if not create_field.many_to_many and create_field.concrete:
mapping[field.column] = self.quote_value( mapping[create_field.column] = self.quote_value(
self.effective_default(field) self.effective_default(create_field)
) )
# Add in any altered fields # Add in any altered fields
for (old_field, new_field) in alter_fields: if alter_field:
old_field, new_field = alter_field
body.pop(old_field.name, None) body.pop(old_field.name, None)
mapping.pop(old_field.column, None) mapping.pop(old_field.column, None)
body[new_field.name] = new_field body[new_field.name] = new_field
@ -126,12 +128,12 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
mapping[new_field.column] = self.quote_name(old_field.column) mapping[new_field.column] = self.quote_name(old_field.column)
rename_mapping[old_field.name] = new_field.name rename_mapping[old_field.name] = new_field.name
# Remove any deleted fields # Remove any deleted fields
for field in delete_fields: if delete_field:
del body[field.name] del body[delete_field.name]
del mapping[field.column] del mapping[delete_field.column]
# Remove any implicit M2M tables # Remove any implicit M2M tables
if field.many_to_many and field.remote_field.through._meta.auto_created: if delete_field.many_to_many and delete_field.remote_field.through._meta.auto_created:
return self.delete_model(field.remote_field.through) return self.delete_model(delete_field.remote_field.through)
# Work inside a new app registry # Work inside a new app registry
apps = Apps() apps = Apps()
@ -225,7 +227,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
# Special-case implicit M2M tables # Special-case implicit M2M tables
if field.many_to_many and field.remote_field.through._meta.auto_created: if field.many_to_many and field.remote_field.through._meta.auto_created:
return self.create_model(field.remote_field.through) return self.create_model(field.remote_field.through)
self._remake_table(model, create_fields=[field]) self._remake_table(model, create_field=field)
def remove_field(self, model, field): def remove_field(self, model, field):
""" """
@ -243,13 +245,13 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
# It might not actually have a column behind it # It might not actually have a column behind it
if field.db_parameters(connection=self.connection)['type'] is None: if field.db_parameters(connection=self.connection)['type'] is None:
return return
self._remake_table(model, delete_fields=[field]) self._remake_table(model, delete_field=field)
def _alter_field(self, model, old_field, new_field, old_type, new_type, def _alter_field(self, model, old_field, new_field, old_type, new_type,
old_db_params, new_db_params, strict=False): old_db_params, new_db_params, strict=False):
"""Actually perform a "physical" (non-ManyToMany) field update.""" """Actually perform a "physical" (non-ManyToMany) field update."""
# Alter by remaking table # Alter by remaking table
self._remake_table(model, alter_fields=[(old_field, new_field)]) self._remake_table(model, alter_field=(old_field, new_field))
def _alter_many_to_many(self, model, old_field, new_field, strict): def _alter_many_to_many(self, model, old_field, new_field, strict):
""" """
@ -259,12 +261,12 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
# The field name didn't change, but some options did; we have to propagate this altering. # The field name didn't change, but some options did; we have to propagate this altering.
self._remake_table( self._remake_table(
old_field.remote_field.through, old_field.remote_field.through,
alter_fields=[( alter_field=(
# We need the field that points to the target model, so we can tell alter_field to change it - # We need the field that points to the target model, so we can tell alter_field to change it -
# this is m2m_reverse_field_name() (as opposed to m2m_field_name, which points to our model) # this is m2m_reverse_field_name() (as opposed to m2m_field_name, which points to our model)
old_field.remote_field.through._meta.get_field(old_field.m2m_reverse_field_name()), old_field.remote_field.through._meta.get_field(old_field.m2m_reverse_field_name()),
new_field.remote_field.through._meta.get_field(new_field.m2m_reverse_field_name()), new_field.remote_field.through._meta.get_field(new_field.m2m_reverse_field_name()),
)], ),
) )
return return