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 UniqueConstraint
s since the database needs to destroy and re-create an index.
Change History
(24)
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
|
Thanks for the report 🏆
Aside from running useless commands, dropping & adding constraints on a production database may be undesirable.