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 )
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 , 5 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 5 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 , 5 years ago
| Description: | modified (diff) |
|---|
comment:4 by , 5 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_stringyou happened to make0004_auto_20200529_2006migration invalid.In your case that means you should have copied your old version of
random_stringthat returned a string of length 7 to0004_auto_20200529_2006add adjust theAddFieldoperation to point to it instead of the alteredcells.models.random_string.