Opened 5 years ago

Closed 5 years ago

#31665 closed Bug (wontfix)

Auto-migrations fail on postgres when Charfield's default value is longer than old constraint

Reported by: shadytradesman Owned by: nobody
Component: Migrations Version: 2.2
Severity: Normal Keywords: charfield resize default alterfield max_length
Cc: 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 shadytradesman)

Migration to create the field

# Generated by Django 2.2.12 on 2020-05-29 19:06

import cells.models
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('cells', '0003_auto_20200529_1832'),
    ]

    operations = [
        migrations.AddField(
            model_name='cell',
            name='invite_link_secret_key',
            field=models.CharField(default=cells.models.random_string, max_length=7),
        ),
    ]

Migration to resize the field:

# Generated by Django 2.2.12 on 2020-05-29 23:56

import cells.models
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('cells', '0004_auto_20200529_2006'),
    ]

    operations = [
        migrations.AlterField(
            model_name='cell',
            name='invite_link_secret_key',
            field=models.CharField(default=cells.models.random_string, max_length=64),
        ),
    ]

Here is the random string method:

def random_string():
    return hashlib.sha224(bytes(random.randint(1, 99999999))).hexdigest()

This migration worked on mysql when I was developing locally, but it was because I updated the random_string() function to provide a string that was longer after I ran the migration. It failed when I ran it against my prod Postgres 9.5.15 database.

I suggest including default value functions in the migrations so that when old migrations are run against new code, you don't have issues.

Change History (4)

comment:1 by shadytradesman, 5 years ago

Description: modified (diff)

comment:2 by shadytradesman, 5 years ago

Description: modified (diff)
Summary: Auto-migrations fail on postgres when resizing Charfield and setting default value longer than old constraintAuto-migrations fail on postgres when Charfield's default value is longer than old constraint

comment:3 by shadytradesman, 5 years ago

Description: modified (diff)

comment:4 by Simon Charette, 5 years ago

Resolution: wontfix
Status: newclosed

This migration worked on mysql when I was developing locally, but it was because I updated the random_string() function to provide a string that was longer after I ran the migration.

If you alter a function referenced by historical migration you need to make sure the existing operations referencing the function are repointed to a valid definition. By changing the return of random_string you happened to make 0004_auto_20200529_2006 migration invalid.

In your case that means you should have copied your old version of random_string that returned a string of length 7 to 0004_auto_20200529_2006 add adjust the AddField operation to point to it instead of the altered cells.models.random_string.

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