with tutorial meet framework espaƱol applications django postgresql python-3.x django-models

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:

    1. Descarte las tablas involucradas en esa migración de esa aplicación (considere una solución alternativa de copia de seguridad, si corresponde)
    2. 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:

  1. Vacíe la tabla django_migrations : delete from django_migrations; con un comando DELETE FROM django_migrations WHERE app=''my_app'';
  2. Para cada aplicación, elimine su carpeta de migrations : rm -rf <app>/migrations/
  3. Restablezca las migraciones para las aplicaciones "integradas": python manage.py migrate --fake
  4. 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).
  5. 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)