mirror of
https://github.com/django/django.git
synced 2025-06-05 11:39:13 +00:00
Refs #34320 -- Stopped recreating check constraints when renaming fields.
This also fixes test_rename_field_with_check_to_truncated_name() on MariaDB 10.5.2+ as ALTER TABLE ... RENAME COLUMN statement doesn't rename inline constraints.
This commit is contained in:
parent
ef00d6ef88
commit
9953c804a9
@ -838,6 +838,17 @@ class BaseDatabaseSchemaEditor:
|
|||||||
strict,
|
strict,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _field_db_check(self, field, field_db_params):
|
||||||
|
# Always check constraints with the same mocked column name to avoid
|
||||||
|
# recreating constrains when the column is renamed.
|
||||||
|
check_constraints = self.connection.data_type_check_constraints
|
||||||
|
data = field.db_type_parameters(self.connection)
|
||||||
|
data["column"] = "__column_name__"
|
||||||
|
try:
|
||||||
|
return check_constraints[field.get_internal_type()] % data
|
||||||
|
except KeyError:
|
||||||
|
return None
|
||||||
|
|
||||||
def _alter_field(
|
def _alter_field(
|
||||||
self,
|
self,
|
||||||
model,
|
model,
|
||||||
@ -956,7 +967,9 @@ class BaseDatabaseSchemaEditor:
|
|||||||
# is to look at its name (refs #28053).
|
# is to look at its name (refs #28053).
|
||||||
self.execute(self._delete_index_sql(model, index_name))
|
self.execute(self._delete_index_sql(model, index_name))
|
||||||
# Change check constraints?
|
# Change check constraints?
|
||||||
if old_db_params["check"] != new_db_params["check"] and old_db_params["check"]:
|
old_db_check = self._field_db_check(old_field, old_db_params)
|
||||||
|
new_db_check = self._field_db_check(new_field, new_db_params)
|
||||||
|
if old_db_check != new_db_check and old_db_check:
|
||||||
meta_constraint_names = {
|
meta_constraint_names = {
|
||||||
constraint.name for constraint in model._meta.constraints
|
constraint.name for constraint in model._meta.constraints
|
||||||
}
|
}
|
||||||
@ -1162,7 +1175,7 @@ class BaseDatabaseSchemaEditor:
|
|||||||
self._create_fk_sql(rel.related_model, rel.field, "_fk")
|
self._create_fk_sql(rel.related_model, rel.field, "_fk")
|
||||||
)
|
)
|
||||||
# Does it have check constraints we need to add?
|
# Does it have check constraints we need to add?
|
||||||
if old_db_params["check"] != new_db_params["check"] and new_db_params["check"]:
|
if old_db_check != new_db_check and new_db_check:
|
||||||
constraint_name = self._create_index_name(
|
constraint_name = self._create_index_name(
|
||||||
model._meta.db_table, [new_field.column], suffix="_check"
|
model._meta.db_table, [new_field.column], suffix="_check"
|
||||||
)
|
)
|
||||||
|
@ -230,6 +230,19 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
|||||||
model, old_field, new_field, new_type, old_collation, new_collation
|
model, old_field, new_field, new_type, old_collation, new_collation
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _field_db_check(self, field, field_db_params):
|
||||||
|
if self.connection.mysql_is_mariadb and self.connection.mysql_version >= (
|
||||||
|
10,
|
||||||
|
5,
|
||||||
|
2,
|
||||||
|
):
|
||||||
|
return super()._field_db_check(field, field_db_params)
|
||||||
|
# On MySQL and MariaDB < 10.5.2 (no support for
|
||||||
|
# "ALTER TABLE ... RENAME COLUMN" statements), check constraints with
|
||||||
|
# the column name as it requires explicit recreation when the column is
|
||||||
|
# renamed.
|
||||||
|
return field_db_params["check"]
|
||||||
|
|
||||||
def _rename_field_sql(self, table, old_field, new_field, new_type):
|
def _rename_field_sql(self, table, old_field, new_field, new_type):
|
||||||
new_type = self._set_field_new_type_null_status(old_field, new_type)
|
new_type = self._set_field_new_type_null_status(old_field, new_type)
|
||||||
return super()._rename_field_sql(table, old_field, new_field, new_type)
|
return super()._rename_field_sql(table, old_field, new_field, new_type)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user