summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2024-02-03 10:54:51 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2024-02-04 09:24:38 +0100
commit3e7a30fb3a5ea38d06bbedd53e2130bf192425c7 (patch)
tree81d11e0eff12702f57b4b2a2ea845a113bc65585
parent741f080ab595fa34ad0d682a096026abade0dcab (diff)
[5.0.x] Fixed #35162 -- Fixed crash when adding fields with db_default on MySQL.
MySQL doesn't allow literal DEFAULT values to be used for BLOB, TEXT, GEOMETRY or JSON columns and requires expression to be used instead. Regression in 7414704e88d73dafbcfbb85f9bc54cb6111439d3. Backport of dfc77637ea5c1aa81caa72b1cf900e6931d61b54 from main
-rw-r--r--django/db/backends/base/schema.py6
-rw-r--r--docs/releases/5.0.2.txt4
-rw-r--r--tests/schema/tests.py13
3 files changed, 22 insertions, 1 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index ebd3726e65..ff0f2bba75 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -412,7 +412,11 @@ class BaseDatabaseSchemaEditor:
"""Return the sql and params for the field's database default."""
from django.db.models.expressions import Value
- sql = "%s" if isinstance(field.db_default, Value) else "(%s)"
+ sql = (
+ self._column_default_sql(field)
+ if isinstance(field.db_default, Value)
+ else "(%s)"
+ )
query = Query(model=field.model)
compiler = query.get_compiler(connection=self.connection)
default_sql, params = compiler.compile(field.db_default)
diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt
index 64ffcb88bd..a385fbd13e 100644
--- a/docs/releases/5.0.2.txt
+++ b/docs/releases/5.0.2.txt
@@ -32,3 +32,7 @@ Bugfixes
* Fixed a regression in Django 5.0 that caused the ``request_finished`` signal to
sometimes not be fired when running Django through an ASGI server, resulting
in potential resource leaks (:ticket:`35059`).
+
+* Fixed a bug in Django 5.0 that caused a migration crash on MySQL when adding
+ a ``BinaryField``, ``TextField``, ``JSONField``, or ``GeometryField`` with a
+ ``db_default`` (:ticket:`35162`).
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index a16c4a6bfe..eeaa46af06 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -2306,6 +2306,19 @@ class SchemaTests(TransactionTestCase):
columns = self.column_classes(Author)
self.assertEqual(columns["birth_year"][1].default, "1988")
+ @isolate_apps("schema")
+ def test_add_text_field_with_db_default(self):
+ class Author(Model):
+ description = TextField(db_default="(missing)")
+
+ class Meta:
+ app_label = "schema"
+
+ with connection.schema_editor() as editor:
+ editor.create_model(Author)
+ columns = self.column_classes(Author)
+ self.assertIn("(missing)", columns["description"][1].default)
+
@skipUnlessDBFeature(
"supports_column_check_constraints", "can_introspect_check_constraints"
)