tutorial - meet django
Error de migraciĆ³n Django: la columna no existe (8)
Atrapado en este tema recientemente.
En mi caso, agregué una referencia a un campo no existente en el código, luego vine al archivo modelo y agregué el nuevo campo, luego intenté ejecutar el comando makemigrations
que arrojó el error anterior.
Así que fui al rastro de la pila hasta el final y descubrí que la nueva referencia agregada era el problema. makemigrations
eso, corrió makemigrations
y voila.
Python 3, Django 1.8.5, Postgres
Tengo un modelo de Sites
que ha estado funcionando bien. Hace poco intenté agregar un campo, airport_code y migrar los datos.
class Site(BaseModel):
objects = SiteManager()
name = models.CharField(max_length=200, unique=True)
domain = models.CharField(max_length=200, unique=True)
weather = models.CharField(max_length=10)
nearby_sites = models.ManyToManyField(''self'', symmetrical=False, blank=True)
users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)
facebook = models.URLField(max_length=200)
twitter = models.URLField(max_length=200)
header_override = models.TextField(blank=True)
email_header_override = models.TextField(blank=True)
timely_site_tag_id = models.IntegerField()
timely_featured_tag_id = models.IntegerField()
timely_domain = models.CharField(max_length=255)
sitemap_public_id = models.CharField(max_length=255)
state = models.CharField(max_length=24)
airport_code = JSONField()
Sin embargo, cuando ejecuté makemigrations
obtuve un error:
django.db.utils.ProgrammingError: column sites_site.airport_code does not exist LINE 1: ..._site"."sitemap_public_id", "sites_site"."state", "sites_sit...
Por supuesto, esto no tiene sentido, porque la columna obviamente no existe cuando intento crearla dentro de la migración.
He visto muchas preguntas sobre este error en el Desbordamiento de pila sin respuesta, o tengo una solución para crear manualmente el archivo de migración, o destruir y reconstruir la base de datos. Esta no es una solución aceptable.
Después de ejecutar makemigrations, asegúrese de recorrer paso a paso la traza de la pila.
En mi caso, noté que se rastreaba a través de una llamada a un Formulario contenido dentro de un formulario.py en una aplicación completamente diferente, que tenía una llamada al modelo para el que estaba intentando crear una nueva migración.
Mover la clase Form de forms.py a views.py solucionó el problema.
En mi caso, eso se debió a que tenía establecida una restricción unique_together.
Cuando quise eliminar un campo, la migración generada automáticamente intentó eliminar el campo antes de eliminar la restricción unique_together.
Lo que tenía que hacer era mover manualmente las migraciones. Restricción de combinación única en el archivo de migración , de modo que django elimine primero la restricción antes de intentar eliminar el campo.
Espero que esto pueda ayudar a alguien.
Este error se resolvió para mí al comentar la barra de herramientas de depuración de django desde INSTALLED_APPS en settings.py. No estoy seguro de por qué la barra de herramientas de depuración es la culpable, pero después de comentarla, pude ejecutar makemigrations
y migrate
sin problemas.
Espero que esto ayude a alguien, ya que pasé doce horas tratando de resolverlo.
Me encontré con este problema recientemente después de actualizar a Django 1.11. Quería abordar el problema de forma permanente para no tener que comentar / descomprimir el código cada vez que ejecutaba una migración en la tabla, por lo que mi enfoque:
from django.db.utils import ProgrammingError as AvoidDataMigrationError
try:
... do stuff that breaks migrations
except AvoidDataMigrationError:
pass
AvoidDataMigrationError
el nombre de la excepción durante la importación a AvoidDataMigrationError
para que quede claro por qué está allí.
También me encontré con este problema y la respuesta de @Nexus me ayudó. Pensé que proporcionaría detalles de mi caso específico aquí para ilustrar mejor la causa del problema. Me parece un error potencial.
Tengo una Brand
modelo de la siguiente manera:
class Brand(BaseModelClass):
name = CharField(max_length=256, unique=True)
website = ForeignKey(URL, on_delete=CASCADE, null=True, blank=True)
Estaba ejecutando un python manage.py makemigrations
después de agregar un campo Boolean
siguiente manera:
class Brand(BaseModelClass):
name = CharField(max_length=256, unique=True)
website = ForeignKey(URL, on_delete=CASCADE, null=True, blank=True)
trusted = Boolean(default=True)
Al ejecutar el comando makemigrations
, recibí un error similar al de OP:
django.db.utils.ProgrammingError: column appname_brand.trusted does not exist
Según la sugerencia de @Nexus, pasé por el seguimiento de pila, línea por línea, asumiendo que no era un problema central con Django. Como resultado, en uno de los archivos de aplicaciones forms.py
tuve lo siguiente:
choices={(str(brand.id), brand.name) for brand in Brand.objects.all()}
La solución fue simplemente comentar esa línea, ejecutar manage.py makemigrations
y luego ejecutar manage.py migrate
. Después, descomenté la línea y todo y la funcionalidad de mis formularios funcionaron igual que antes.
Tengo el mismo problema (la columna no existe) pero cuando intento ejecutar migrate
no con makemigrations
Causa: eliminé los archivos de migración y los reemplacé con el archivo de migración inicial simulado simple 0001 antes de ejecutar la migración para el último cambio
Solución:
- Descarte las tablas involucradas en esa migración de esa aplicación (considere una solución alternativa de copia de seguridad, si corresponde)
- Elimine las filas responsables de la migración de esa aplicación de la tabla
django_migrations
en la que se registran las migraciones. Así es como Django sabe qué migraciones se han aplicado y cuáles aún deben aplicarse.
Y aquí es cómo resolver este problema:
iniciar sesión como usuario de postgres (mi usuario se llama posgres):
sudo -i -u postgres
Abra un terminal sql y conéctese a su base de datos:
psql -d database_name
Enumere su tabla y localice las tablas relacionadas con esa aplicación:
/dt
Soltarlos (considerar orden de caída con relaciones):
DROP TABLE tablename ;
- En el registro de migración de lista, verá migraciones aplicadas clasificadas como:
id | aplicación | nombre | aplicado
- + ------ + -------- + --------- +
SELECT * FROM django_migrations;
Elimine filas de migraciones de esa aplicación (puede eliminar por ID o por aplicación, con la aplicación no olvide las ''comillas''):
DELETE FROM django_migrations WHERE app=''your_app'';
cierre sesión y ejecute sus migraciones simplemente (tal vez ejecute makemigrations en su caso):
python manage.py migrate --settings=your.settings.module_if_any
Nota: es posible que en su caso no tenga que eliminar todas las tablas de esa aplicación y no todas las migraciones, solo las de los modelos que causan el problema.
Deseo que esto pueda ayudar.
Tengo este problema después de la migración de mi base de datos de Postgres a un servidor diferente. De alguna manera, arruiné la base de datos y no pude actualizar mi modelo con la nueva clase UserProfile.
Resolví el problema creando la migración inicial para el esquema existente:
- Vacíe la tabla
django_migrations
:delete from django_migrations;
con un comandoDELETE FROM django_migrations WHERE app=''my_app'';
- Para cada aplicación, elimine su carpeta de
migrations
:rm -rf <app>/migrations/
- Restablezca las migraciones para las aplicaciones "integradas":
python manage.py migrate --fake
- Para cada aplicación, ejecute:
python manage.py makemigrations <app>
. Cuide las dependencias (los modelos con ForeignKey deben ejecutarse después de su modelo principal). - Finalmente:
python manage.py migrate --fake-initial
Lo tengo aquí: https://.com/a/29898483
PD: no estoy seguro de que esto fuera relevante para la resolución del problema pero, primero, dejé la tabla en postgresql que causó un error y comenté la clase UserProfile en los modelos.
en concha
sudo -su postgres
psql databse_name
DROP TABLE table_name;
modelos.py:
#class UserProfile(models.Model):
#user = models.OneToOneField(settings.AUTH_USER_MODEL, unique=True, primary_key=True, on_delete=models.CASCADE, related_name=''user_profile'')
#avatar = ThumbnailerImageField(upload_to=''profile_images'', blank=True)
#country = models.CharField(max_length = 128)