From 7f1dc67f53c0d7a79031852603b8c8445bca65ac Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 30 Nov 2023 10:10:27 +0100 Subject: [PATCH] [5.0.x] Fixed #35006 -- Fixed migrations crash when altering Meta.db_table_comment on SQLite. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks Юрий for the report. Regression in 78f163a4fb3937aca2e71786fbdd51a0ef39629e. Backport of 37fc832a54ad37e75a898a2c8f9ab0820617c4af from main --- django/db/backends/base/schema.py | 15 ++++++++------- django/db/backends/sqlite3/schema.py | 2 ++ docs/releases/4.2.8.txt | 3 +++ tests/schema/tests.py | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 9c61b1ff17..a311dc432e 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -671,13 +671,14 @@ class BaseDatabaseSchemaEditor: sql.rename_table_references(old_db_table, new_db_table) def alter_db_table_comment(self, model, old_db_table_comment, new_db_table_comment): - self.execute( - self.sql_alter_table_comment - % { - "table": self.quote_name(model._meta.db_table), - "comment": self.quote_value(new_db_table_comment or ""), - } - ) + if self.sql_alter_table_comment and self.connection.features.supports_comments: + self.execute( + self.sql_alter_table_comment + % { + "table": self.quote_name(model._meta.db_table), + "comment": self.quote_value(new_db_table_comment or ""), + } + ) def alter_db_tablespace(self, model, old_db_tablespace, new_db_tablespace): """Move a model's table between tablespaces.""" diff --git a/django/db/backends/sqlite3/schema.py b/django/db/backends/sqlite3/schema.py index 243430a535..c25c9532de 100644 --- a/django/db/backends/sqlite3/schema.py +++ b/django/db/backends/sqlite3/schema.py @@ -19,6 +19,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): sql_delete_column = "ALTER TABLE %(table)s DROP COLUMN %(column)s" sql_create_unique = "CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)" sql_delete_unique = "DROP INDEX %(name)s" + sql_alter_table_comment = None + sql_alter_column_comment = None def __enter__(self): # Some SQLite schema alterations need foreign key constraints to be diff --git a/docs/releases/4.2.8.txt b/docs/releases/4.2.8.txt index 0550e026bb..1cce9030ec 100644 --- a/docs/releases/4.2.8.txt +++ b/docs/releases/4.2.8.txt @@ -35,3 +35,6 @@ Bugfixes * Fixed a regression in Django 4.2 where the admin's read-only password widget and some help texts were incorrectly aligned at tablet widths (:ticket:`34982`). + +* Fixed a regression in Django 4.2 that caused a migration crash on SQLite when + altering unsupported ``Meta.db_table_comment`` (:ticket:`35006`). diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 0738026a31..a37b49b31d 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -4870,6 +4870,23 @@ class SchemaTests(TransactionTestCase): [None, ""], ) + @isolate_apps("schema") + @skipIfDBFeature("supports_comments") + def test_db_comment_table_unsupported(self): + class ModelWithDbTableComment(Model): + class Meta: + app_label = "schema" + db_table_comment = "Custom table comment" + + # Table comments are ignored on databases that don't support them. + with connection.schema_editor() as editor, self.assertNumQueries(1): + editor.create_model(ModelWithDbTableComment) + self.isolated_local_models = [ModelWithDbTableComment] + with connection.schema_editor() as editor, self.assertNumQueries(0): + editor.alter_db_table_comment( + ModelWithDbTableComment, "Custom table comment", "New table comment" + ) + @isolate_apps("schema") @skipUnlessDBFeature("supports_comments", "supports_foreign_keys") def test_db_comments_from_abstract_model(self):