Ошибка "транзакция активна" при переносе модели django

Я переименовал какое-то поле в своей модели и запустил

python manage.py makemigration # successful
python manage.py migrate

По второй команде я получаю

NotSupportedError: Renaming the 'my_model'.''my_column' while in a transaction is not supported on SQLite because it would break referential integrity. Try adding atomic = False to the Migration class

Однако я не понимаю, какую транзакцию это означает. В то время, когда я получаю эту ошибку, не работает процесс python или sqlite. Осталась ли какая-то блокировка в файле sqlite или django? И как мне это исправить ??

1
0
493
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Перейдите в папку приложения, в которой вы переименовали какое-либо поле в модели. когда вы выполнили эту команду

python manage.py makemigration.

Это в папке приложения внутри папки миграции сделало бы файл миграции (последний файл, например: 000_initial).

Откройте этот файл внутри того класса миграции, который будет записан в начале этого класса, добавьте это.

atomic = False

Это будет выглядеть примерно так

class Migration(migrations.Migration):
    atomic = False

Это поможет вам запустить команду без ошибок:

python manage.py migrate

Для получения дополнительной справочной информации: https://docs.djangoproject.com/en/2.1/howto/writing-migrations/

Спасибо за ответ. Однако мой главный вопрос - как определить текущую транзакцию. На данный момент я могу обойтись без atomic=False, но в долгосрочной перспективе это небезопасно.

blue_note 31.10.2018 14:23

Благодаря этой ссылочной целостности я могу сказать, что столбец, который вы пытаетесь переименовать, уже является внешним ключом или какое-то отношение создано в другой таблице, поэтому его нельзя переименовать, и это вызывает ошибку. В базах данных, поддерживающих транзакции DDL (SQLite и PostgreSQL), миграции по умолчанию будут выполняться внутри транзакции. Для случаев использования, таких как выполнение миграции данных в больших таблицах.

somsgod 31.10.2018 14:33

Итак, «транзакция» относится к фактическому переименованию внутри sqlite? ничего связанного с питоном ??

blue_note 31.10.2018 14:38

Да, это та же транзакция БД. Даже вы можете запустить транзакцию вручную в Django, импортировав класс транзакции. Если функция atomic () используется для запуска новой транзакции, а по завершении транзакции вы можете использовать on_commit ().

somsgod 31.10.2018 14:41

Другие вопросы по теме