浏览代码

Fixed #33899 -- Fixed migration crash when removing indexed field on SQLite 3.35.5+.

Regression in 702819227fd0cdd9b581cd99e11d1561d51cbeb.

Thanks cessor for the report.
Fiza Ashraf 2 年之前
父节点
当前提交
c0beff2123
共有 4 个文件被更改,包括 18 次插入2 次删除
  1. 1 0
      AUTHORS
  2. 3 2
      django/db/backends/sqlite3/schema.py
  3. 3 0
      docs/releases/4.1.1.txt
  4. 11 0
      tests/schema/tests.py

+ 1 - 0
AUTHORS

@@ -322,6 +322,7 @@ answer newbie questions, and generally made Django that much better:
     Filip Noetzel <http://filip.noetzel.co.uk/>
     Filip Wasilewski <filip.wasilewski@gmail.com>
     Finn Gruwier Larsen <finn@gruwier.dk>
+    Fiza Ashraf <fizaashraf37@gmail.com>
     Flávio Juvenal da Silva Junior <flavio@vinta.com.br>
     flavio.curella@gmail.com
     Florian Apolloner <florian@apolloner.eu>

+ 3 - 2
django/db/backends/sqlite3/schema.py

@@ -408,10 +408,11 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
             # For explicit "through" M2M fields, do nothing
         elif (
             self.connection.features.can_alter_table_drop_column
-            # Primary keys, unique fields, and foreign keys are not
-            # supported in ALTER TABLE DROP COLUMN.
+            # Primary keys, unique fields, indexed fields, and foreign keys are
+            # not supported in ALTER TABLE DROP COLUMN.
             and not field.primary_key
             and not field.unique
+            and not field.db_index
             and not (field.remote_field and field.db_constraint)
         ):
             super().remove_field(model, field)

+ 3 - 0
docs/releases/4.1.1.txt

@@ -26,3 +26,6 @@ Bugfixes
 * Fixed a regression in Django 4.1 that caused a crash of
   :class:`~django.db.models.expressions.Window` expressions with
   :class:`~django.contrib.postgres.aggregates.ArrayAgg` (:ticket:`33898`).
+
+* Fixed a regression in Django 4.1 that caused a migration crash on SQLite
+  3.35.5+ when removing an indexed field (:ticket:`33899`).

+ 11 - 0
tests/schema/tests.py

@@ -813,6 +813,17 @@ class SchemaTests(TransactionTestCase):
                 False,
             )
 
+    def test_remove_indexed_field(self):
+        with connection.schema_editor() as editor:
+            editor.create_model(AuthorCharFieldWithIndex)
+        with connection.schema_editor() as editor:
+            editor.remove_field(
+                AuthorCharFieldWithIndex,
+                AuthorCharFieldWithIndex._meta.get_field("char_field"),
+            )
+        columns = self.column_classes(AuthorCharFieldWithIndex)
+        self.assertNotIn("char_field", columns)
+
     def test_alter(self):
         """
         Tests simple altering of fields