Opened 10 years ago
Last modified 5 years ago
#25012 closed Bug
Migrations don't make foreign key type changes — at Version 12
| Reported by: | Hedde van der Heide | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | dev |
| Severity: | Normal | Keywords: | migrations |
| Cc: | Tyson Clugg, Samuel Bishop | Triage Stage: | Accepted |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Example:
class Foo(models.Model): id = models.AutoField() # Now change this to models.CharField(primary_key=True, max_length=...) and migrate, the migration doesn't complain class Bar(object): foo = models.ForeignKey(Foo) # but Postgres will still say Bar.foo is an Integer value.
DataError at /myapp/bar/add/ invalid input syntax for integer: "TEST" LINE 1: ...d") VALUES (NULL, 'TEST', ...
Change History (12)
comment:1 by , 10 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 10 years ago
| Description: | modified (diff) |
|---|
comment:3 by , 10 years ago
| Component: | Uncategorized → Migrations |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
| Type: | Uncategorized → Bug |
comment:4 by , 10 years ago
| Cc: | added |
|---|
comment:6 by , 10 years ago
| Keywords: | postgres migrations removed |
|---|---|
| Version: | 1.8 → master |
#24954 was a duplicate for the ManyToManyField case.
comment:8 by , 9 years ago
I was able to neatly fix this with a raw SQL migration that changed the intermediary table column type.
I had the following schema in an application called documents:
class Tag(models.Model):
# converted this `name` field to primary_key
# previously had the default `id` AutoField as primary_key field
# PrimaryKeyField migration in for ManyToManyField is risky!
name = models.CharField(max_length=32, primary_key=True)
class Document(models.Model):
tags = models.ManyToManyField(Tag, blank=True)
After changing the schema and running unit tests I discovered that I indeed to got a DatabaseError:
django.db.utils.DataError: invalid input syntax for integer: "Miss Amanda Goodwin" LINE 1: ..."tag_id") WHERE "documents_document_tags"."tag_id" = 'Miss Aman...
Migrating with the following helped:
ALTER TABLE documents_document_tags ALTER COLUMN tag_id TYPE varchar(32);
This of course had to be added as a migration file for sane functionality in tests and migration chain:
# -*- coding: utf-8 -*-
# Migrations file example for fixing broken ManyToManyField migration from INTEGER to VARCHAR
# Generated by Django 1.10.3 on 1970-01-01 00:00
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('documents', '0042_auto_19700101-0000'),
]
operations = [
migrations.RunSQL('ALTER TABLE documents_document_tags ALTER tag_id TYPE varchar(32);'),
]
comment:9 by , 7 years ago
If this is the same as #29787, then 45ded053b1f4320284aa5dac63052f6d1baefea9 and b8a2f3c2d66aa15af4be745a576609b958a853c0 might be useful commits to look at.
comment:10 by , 6 years ago
| Cc: | added |
|---|---|
| Keywords: | migrations added |
comment:11 by , 5 years ago
I ran in to this today (Django 3.1.4). The workaround was to
UPDATE myapp.mytable set my_fk_column = NULL;
and re-run the migration.
comment:12 by , 5 years ago
| Description: | modified (diff) |
|---|---|
| Summary: | Migration doesn't seem to detect foreignKey type changes → Migrations don't make foreign key type changes |
Confirmed on master.