Opened 5 months ago

Last modified 3 months ago

#35038 assigned Cleanup/optimization

Changing violation_error_message on constraints cause a remove/add operation in migration

Reported by: David Owned by: Adrienne Franke
Component: Migrations Version: 4.1
Severity: Normal Keywords:
Cc: Adrienne Franke Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description

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 (10)

comment:1 by David Sanders, 5 months ago

Triage Stage: UnreviewedAccepted

Thanks for the report 🏆

Aside from running useless commands, dropping & adding constraints on a production database may be undesirable.

comment:3 by Mariusz Felisiak, 4 months ago

Has patch: unset

comment:4 by Salvo Polizzi, 4 months ago

Owner: changed from nobody to Salvo Polizzi
Status: newassigned

comment:5 by Salvo Polizzi, 4 months ago

Owner: Salvo Polizzi removed
Status: assignednew

comment:6 by Nathaniel Conroy, 4 months ago

Owner: set to Nathaniel Conroy
Status: newassigned

comment:7 by Nathaniel Conroy, 4 months ago

Owner: Nathaniel Conroy removed
Status: assignednew

comment:8 by Adrienne Franke, 3 months ago

Owner: set to Adrienne Franke
Status: newassigned

comment:9 by Adrienne Franke, 3 months ago

Cc: Adrienne Franke added
Has patch: set

comment:10 by Mariusz Felisiak, 3 months ago

Needs tests: set
Patch needs improvement: set

Marking as needs improvement pending a discussion.

Note: See TracTickets for help on using tickets.
Back to Top