TransactionManagementError «Управляемый блок транзакции завершился с ожиданием COMMIT / ROLLBACK» при выполнении миграций в Django - PullRequest
2 голосов
/ 07 февраля 2020

Когда я выполняю миграцию, используя python manage.py migrate manage (да, это Django 1.8, и я не могу ее изменить: /), миграции (все, что я тестировал) всегда завершаются ошибкой:

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

enter image description here

Вот код из файла миграции:

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

Я видел ответы на другие похожие вопросы, но нет У меня нет кода @commit .... в моем коде.

Может кто-нибудь мне помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Удалите папку миграций и повторно запустите миграции ./manage.py app makemigrations ./manage.py migrate

или

Вы также можете подделать миграции и сбросить их

1 голос
/ 12 февраля 2020

При переносе данных следует избегать импорта модели напрямую, поскольку «фактическая» модель может быть несовместима с предыдущими миграциями.

Так, например, используйте:

# 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')

вместо

from yourappname.models import Person

См .: https://docs.djangoproject.com/en/3.0/topics/migrations/#data -миграции

Это по крайней мере с последними версиями Django; Я точно не помню, как справиться с этим с помощью South

Вы также можете попытаться добавить эту опцию в определение DATABASES ['default']:

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

, поскольку с Django 1.8 по умолчанию для автоматической фиксации было False (вероятно); иногда это помогает получить правильное исключение БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...