Opened 4 years ago
Closed 4 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 )
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 , 4 years ago
Description: | modified (diff) |
---|
comment:2 by , 4 years ago
Description: | modified (diff) |
---|---|
Summary: | Auto-migrations fail on postgres when resizing Charfield and setting default value longer than old constraint → Auto-migrations fail on postgres when Charfield's default value is longer than old constraint |
comment:3 by , 4 years ago
Description: | modified (diff) |
---|
comment:4 by , 4 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
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 make0004_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 to0004_auto_20200529_2006
add adjust theAddField
operation to point to it instead of the alteredcells.models.random_string
.