Refs #35074 -- Avoided failed attempts to remove spatial indexes on nullable fields on MySQL.

MySQL doesn't support spatial indexes on NULL columns, so there is no
point in removing them.
This commit is contained in:
Mariusz Felisiak 2024-06-18 22:19:11 +02:00 committed by Sarah Boyce
parent aba0e541ca
commit 20c2d625d3
2 changed files with 19 additions and 1 deletions

View File

@ -54,7 +54,7 @@ class MySQLGISSchemaEditor(DatabaseSchemaEditor):
self.create_spatial_indexes()
def remove_field(self, model, field):
if isinstance(field, GeometryField) and field.spatial_index:
if isinstance(field, GeometryField) and field.spatial_index and not field.null:
index_name = self._create_spatial_index_name(model, field)
sql = self._delete_index_sql(model, index_name)
try:

View File

@ -133,6 +133,24 @@ class OperationTests(OperationTestCase):
if self.has_spatial_indexes:
self.assertSpatialIndexExists("gis_neighborhood", "path")
@skipUnless(connection.vendor == "mysql", "MySQL specific test")
def test_remove_geom_field_nullable_with_index(self):
# MySQL doesn't support spatial indexes on NULL columns.
with self.assertNumQueries(1) as ctx:
self.alter_gis_model(
migrations.AddField,
"Neighborhood",
"path",
fields.LineStringField,
field_class_kwargs={"null": True},
)
self.assertColumnExists("gis_neighborhood", "path")
self.assertNotIn("CREATE SPATIAL INDEX", ctx.captured_queries[0]["sql"])
with self.assertNumQueries(1), self.assertNoLogs("django.contrib.gis", "ERROR"):
self.alter_gis_model(migrations.RemoveField, "Neighborhood", "path")
self.assertColumnNotExists("gis_neighborhood", "path")
@skipUnless(HAS_GEOMETRY_COLUMNS, "Backend doesn't support GeometryColumns.")
def test_geom_col_name(self):
self.assertEqual(