From 37fc832a54ad37e75a898a2c8f9ab0820617c4af Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 30 Nov 2023 10:10:27 +0100 Subject: [PATCH] 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. --- 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 ef859907de8c..aeb3cde9a4df 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -670,13 +670,14 @@ def alter_db_table(self, model, old_db_table, new_db_table): 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 64cf0188d2bc..d27a8bbd65d7 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 0550e026bb64..1cce9030ec37 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 46d16e9fdb6b..d1d18bab176d 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -4741,6 +4741,23 @@ class Meta: [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):