Cuando realizo las migraciones usando python manage.py migrate manage (sí, es Django 1.8 y no puedo cambiarlo: /), las migraciones (todas y cada una de las que probé) siempre fallan con el mismo error:

django.db.transaction.TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

enter image description here

Aquí está el código del archivo de migración:

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Check expiry keys in Organization
        for org in Organization.objects.all():
            self.checkExpiryDate(org)
        # Check expiry keys in UserProfileRoleInOrganization
        for uprio in UserProfileRoleInOrganization.objects.all():
            self.checkExpiryDate(uprio)

    def checkExpiryDate(self, entity):
        # Check if expiry_date is consistent with apikey and fix it if necessary
        if not entity.date_has_changed:
            return
        date_in_key = entity.getExpiryDateInKey()
        if not date_in_key:
            return
        y = int(date_in_key[:4])
        m = int(date_in_key[4:-2])
        d = int(date_in_key[-2:])
        entity.expiry_date = datetime.datetime(y,m,d)
        entity.save()

    def backwards(self, orm):
        pass

He visto algunas respuestas a otras preguntas similares, pero no, no tengo ningún decorador @commit .... en mi código.

¿Alguien me puede ayudar por favor?

2
Arlien 7 feb. 2020 a las 19:00

2 respuestas

La mejor respuesta

Elimine la carpeta de migraciones y vuelva a ejecutar migraciones ./manage.py makemigrations app ./manage.py migrate

O

También puede simular las migraciones y restablecerlo

1
Suhas Kashyap 18 feb. 2020 a las 06:48

En una migración de datos, debe evitar importar el Modelo directamente, ya que el Modelo "real" podría ser inconsistente con las migraciones anteriores.

Entonces, por ejemplo, use:

# We can't import the Person model directly as it may be a newer
# version than this migration expects. We use the historical version.
Person = apps.get_model('yourappname', 'Person')

En lugar de

from yourappname.models import Person

Ver: https://docs.djangoproject.com/en/3.0 / topics / migraciones / # migraciones de datos

Esto al menos con versiones recientes de Django; No recuerdo exactamente cómo lidiar con esto con South

También puede intentar agregar esta opción a la definición de BASES DE DATOS ['predeterminado']:

'OPTIONS': {'autocommit': True,}

Ya que con Django 1.8 el valor predeterminado para la confirmación automática era Falso (probablemente); a veces, esto ayuda a recibir la excepción db adecuada.

1
Mario Orlandi 12 feb. 2020 a las 10:01