Refs #32502 -- Avoided table rebuild when adding fields with no default on SQLite.
This commit is contained in:
parent
57f0638573
commit
2f73e5406d
|
@ -15,6 +15,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
||||||
sql_delete_table = "DROP TABLE %(table)s"
|
sql_delete_table = "DROP TABLE %(table)s"
|
||||||
sql_create_fk = None
|
sql_create_fk = None
|
||||||
sql_create_inline_fk = "REFERENCES %(to_table)s (%(to_column)s) DEFERRABLE INITIALLY DEFERRED"
|
sql_create_inline_fk = "REFERENCES %(to_table)s (%(to_column)s) DEFERRABLE INITIALLY DEFERRED"
|
||||||
|
sql_create_column_inline_fk = sql_create_inline_fk
|
||||||
sql_create_unique = "CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)"
|
sql_create_unique = "CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)"
|
||||||
sql_delete_unique = "DROP INDEX %(name)s"
|
sql_delete_unique = "DROP INDEX %(name)s"
|
||||||
|
|
||||||
|
@ -322,14 +323,14 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
||||||
self.deferred_sql.remove(sql)
|
self.deferred_sql.remove(sql)
|
||||||
|
|
||||||
def add_field(self, model, field):
|
def add_field(self, model, field):
|
||||||
"""
|
"""Create a field on a model."""
|
||||||
Create a field on a model. Usually involves adding a column, but may
|
# Fields with default values cannot by handled by ALTER TABLE ADD
|
||||||
involve adding a table instead (for M2M fields).
|
# COLUMN statement because DROP DEFAULT is not supported in
|
||||||
"""
|
# ALTER TABLE.
|
||||||
# Special-case implicit M2M tables
|
if not field.null or self.effective_default(field) is not None:
|
||||||
if field.many_to_many and field.remote_field.through._meta.auto_created:
|
self._remake_table(model, create_field=field)
|
||||||
return self.create_model(field.remote_field.through)
|
else:
|
||||||
self._remake_table(model, create_field=field)
|
super().add_field(model, field)
|
||||||
|
|
||||||
def remove_field(self, model, field):
|
def remove_field(self, model, field):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -517,6 +517,15 @@ class SchemaTests(TransactionTestCase):
|
||||||
'column': editor.quote_name(new_field.name),
|
'column': editor.quote_name(new_field.name),
|
||||||
}
|
}
|
||||||
self.assertFalse(any(drop_default_sql in query['sql'] for query in ctx.captured_queries))
|
self.assertFalse(any(drop_default_sql in query['sql'] for query in ctx.captured_queries))
|
||||||
|
# Table is not rebuilt.
|
||||||
|
self.assertIs(any(
|
||||||
|
'CREATE TABLE' in query['sql']
|
||||||
|
for query in ctx.captured_queries
|
||||||
|
), False)
|
||||||
|
self.assertIs(any(
|
||||||
|
'DROP TABLE' in query['sql']
|
||||||
|
for query in ctx.captured_queries
|
||||||
|
), False)
|
||||||
columns = self.column_classes(Author)
|
columns = self.column_classes(Author)
|
||||||
self.assertEqual(columns['age'][0], connection.features.introspected_field_types['IntegerField'])
|
self.assertEqual(columns['age'][0], connection.features.introspected_field_types['IntegerField'])
|
||||||
self.assertTrue(columns['age'][1][6])
|
self.assertTrue(columns['age'][1][6])
|
||||||
|
|
Loading…
Reference in New Issue