Changing violation_error_message on constraints cause a remove/add operation in migration
Changing the violation_error_message of a constraint and running makemigrations causes the migration to be written with two operations RemoveConstraint and AddConstraint .
Suppose we start with this situation:
from django.db import models
class MyModel(models.Model):
counter = models.IntegerField(defalt=0)
max_value = models.IntegerField(defalt=0)
name = models.CharField(max_length=4)
class Meta:
constraints = (
models.CheckConstraint(
check=models.Q(counter__gte=models.F('max_value')),
name='counter_lower_than_max',
),
models.UniqueConstraint(
fields=('name', 'max_value')
name='uniq_name_and_max',
),
)
If we add a custom violation_error_message and run makemigrations it will output
$ ./manage.py makemigrations mysample -n update_violation_msgs
Migrations for 'mysample':
mysample/migrations/0002_update_violation_msgs.py
- Remove constraint counter_lower_than_max from model mymodel
- Create constraint counter_lower_than_max on model mymodel
- Remove constraint uniq_name_and_maxfrom model mymodel
- Create constraint uniq_name_and_maxon model mymodel
This will cause the database tu run useless commands, since nothing on database side has changed!
This may be a particular problem when applied to UniqueConstraints since the database needs to destroy and re-create an index.
Change History
(27)
| Triage Stage: |
Unreviewed → Accepted
|
| Owner: |
changed from nobody to Salvo Polizzi
|
| Status: |
new → assigned
|
| Owner: |
Salvo Polizzi removed
|
| Status: |
assigned → new
|
| Owner: |
set to Nathaniel Conroy
|
| Status: |
new → assigned
|
| Owner: |
Nathaniel Conroy removed
|
| Status: |
assigned → new
|
| Owner: |
set to Adrienne Franke
|
| Status: |
new → assigned
|
| Cc: |
Adrienne Franke added
|
| Has patch: |
set
|
| Needs tests: |
set
|
| Patch needs improvement: |
set
|
| Owner: |
changed from Adrienne Franke to Salvo Polizzi
|
| Patch needs improvement: |
unset
|
| Needs documentation: |
unset
|
| Patch needs improvement: |
set
|
| Patch needs improvement: |
unset
|
| Patch needs improvement: |
set
|
| Needs tests: |
set
|
| Patch needs improvement: |
unset
|
| Needs tests: |
unset
|
| Triage Stage: |
Accepted → Ready for checkin
|
| Resolution: |
→ fixed
|
| Status: |
assigned → closed
|
| Patch needs improvement: |
set
|
| Patch needs improvement: |
unset
|
Thanks for the report 🏆
Aside from running useless commands, dropping & adding constraints on a production database may be undesirable.