Jelajahi Sumber

Fixed #25393 -- Fixed MySQL crash when adding text/blob field with unhashable default.

Ville Skyttä 9 tahun lalu
induk
melakukan
4d933ad418

+ 2 - 1
django/db/backends/mysql/schema.py

@@ -50,7 +50,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
         super(DatabaseSchemaEditor, self).add_field(model, field)
 
         # Simulate the effect of a one-off default.
-        if self.skip_default(field) and field.default not in {None, NOT_PROVIDED}:
+        # field.default may be unhashable, so a set isn't used for "in" check.
+        if self.skip_default(field) and field.default not in (None, NOT_PROVIDED):
             effective_default = self.effective_default(field)
             self.execute('UPDATE %(table)s SET %(column)s = %%s' % {
                 'table': self.quote_name(model._meta.db_table),

+ 3 - 0
docs/releases/1.8.5.txt

@@ -29,3 +29,6 @@ Bugfixes
 
 * Alphabetized ordering of imports in ``from django.db import migrations,
   models`` statement in newly created migrations (:ticket:`25384`).
+
+* Fixed migrations crash on MySQL when adding a text or a blob field with an
+  unhashable default (:ticket:`25393`).

+ 1 - 0
docs/spelling_wordlist

@@ -869,6 +869,7 @@ unglamorous
 ungrouped
 unhandled
 unharmful
+unhashable
 unicode
 uninstall
 uninstalling

+ 12 - 0
tests/schema/tests.py

@@ -1673,3 +1673,15 @@ class SchemaTests(TransactionTestCase):
             )
             if connection.features.can_introspect_default:
                 self.assertIsNone(field.default)
+
+    def test_add_textfield_unhashable_default(self):
+        # Create the table
+        with connection.schema_editor() as editor:
+            editor.create_model(Author)
+        # Create a row
+        Author.objects.create(name='Anonymous1')
+        # Create a field that has an unhashable default
+        new_field = TextField(default={})
+        new_field.set_attributes_from_name("info")
+        with connection.schema_editor() as editor:
+            editor.add_field(Author, new_field)