Opened 4 years ago

Closed 4 years ago

#31186 closed Bug (wontfix)

Migration crash when changing CharField to TextField and removing related unique constraint on MySQL.

Reported by: Kailegh Owned by: nobody
Component: Migrations Version: dev
Severity: Normal Keywords: migration, TextField, CharField
Cc: Markus Holtermann Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Mariusz Felisiak)

Hi, I think I have discovered a bug, if you have a field like the following:

audio_name = models.CharField(blank=False, max_length=255)

and decide to change it to the following one:

audio_name = models.TextField(blank=False)

it generates the following migration code:

   operations = [
        migrations.AlterModelOptions(
            name='s3_bucket_audios',
            options={},
        ),
        migrations.AlterField(
            model_name='s3_bucket_audios',
            name='audio_name',
            field=models.TextField(help_text='name of the audio in the s3 bucket'),
        ),
        migrations.AlterUniqueTogether(
            name='s3_bucket_audios',
            unique_together=set(),
        ),
    ]

However it that field was being use in a unique condition:

class Meta:
   ordering = [ "audio_name"]
   unique_together = ('audio_name')

you get the following error:

django.db.utils.OperationalError: (1170, "BLOB/TEXT column 'audio_name' used in key specification without a key length")

That is because it changes the field type before changing the unique condition, I think the order should be handled automatically, I had to change the code manually to:

   operations = [
        migrations.AlterModelOptions(
            name='s3_bucket_audios',
            options={},
        ),
        migrations.AlterUniqueTogether(
            name='s3_bucket_audios',
            unique_together=set(),
        ),
        migrations.AlterField(
            model_name='s3_bucket_audios',
            name='audio_name',
            field=models.TextField(help_text='name of the audio in the s3 bucket'),
        ),
    ]

It is not a big issue anyway...
Thanks a lot for your amazing work!!

Change History (2)

comment:1 by Mariusz Felisiak, 4 years ago

Description: modified (diff)
Type: UncategorizedBug

comment:2 by Mariusz Felisiak, 4 years ago

Cc: Markus Holtermann added
Resolution: wontfix
Status: newclosed
Summary: Error updating unique fieldMigration crash when changing CharField to TextField and removing related unique constraint on MySQL.
Version: 2.2master

Thanks for this report, however this is a MySQL caveat and I don't think we can detect that correctly. In the reverse direction (i.e. changing TextField to CharField and adding unique_together) the operations' order is correct, AlterField and AlterUniqueTogether.

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