Ответ 1
Вы можете попробовать следующее:
from django.db import connection
connection._rollback()
Более подробное обсуждение Эта проблема может быть найдена здесь
Я начал работать на сайте Django/Postgres. Иногда я работаю в manage.py shell
и случайно делаю какое-то действие DB, которое приводит к ошибке. Тогда я не могу вообще выполнять действие с базой данных, потому что для любого действия базы данных, которое я пытаюсь сделать, я получаю ошибку:
current transaction is aborted, commands ignored until end of transaction block
Моим текущим обходным решением является перезапуск оболочки, но я должен найти способ исправить это, не отказываясь от сеанса моей оболочки.
(Я читал этот и этот, но они не дают действенных инструкций о том, что делать из оболочки.)
Вы можете попробовать следующее:
from django.db import connection
connection._rollback()
Более подробное обсуждение Эта проблема может быть найдена здесь
это случается со мной иногда, часто это отсутствует
manage.py migrate
или
manage.py syncdb
как упоминалось здесь и здесь
это также может произойти наоборот, если у вас есть схематизация, ожидающая рассмотрения с ваших моделей .py. С юга вам нужно обновить схему с помощью.
manage.py schemamigration mymodel --auto
Быстрый ответ, как правило, заключается в том, чтобы включить автосоздание уровня базы данных, добавив:
'OPTIONS': {'autocommit': True,}
К настройкам базы данных.
У меня была эта ошибка после восстановления резервной копии до абсолютно пустой БД. Он ушел после запуска:
./manage syncdb
Возможно, в дампе отсутствовали внутренние модели...
ПРЕДУПРЕЖДЕНИЕ: патч ниже может привести к тому, что транзакции остаются в открытом состоянии на db (по крайней мере, с postgres). Не 100% уверены в этом (и как исправить), но я настоятельно рекомендую не делать патч ниже в производственных базах данных.
Поскольку принятый ответ не решает мои проблемы - как только я получаю какую-либо ошибку DB, я не могу делать никаких новых действий с DB, даже с ручным откатом - я придумал свое решение.
Когда я запускаю Django-shell, я исправляю Django, чтобы закрыть соединение с БД, как только возникнут какие-либо ошибки. Таким образом, мне никогда не придется думать об откате транзакций или обработке соединения.
Это код, который я загружаю в начале моего сеанса Django-shell:
from django import db
from django.db.backends.util import CursorDebugWrapper
old_execute = CursorDebugWrapper.execute
old_execute_many = CursorDebugWrapper.executemany
def execute_wrapper(*args, **kwargs):
try:
old_execute(*args, **kwargs)
except Exception, ex:
logger.error("Database error:\n%s" % ex)
db.close_connection
def execute_many_wrapper(*args, **kwargs):
try:
old_execute_many(*args, **kwargs)
except Exception, ex:
logger.error("Database error:\n%s" % ex)
db.close_connection
CursorDebugWrapper.execute = execute_wrapper
CursorDebugWrapper.executemany = execute_many_wrapper
Если вы столкнулись с такой ошибкой при запуске migrate
(Юг), возможно, у вас много изменений в схеме базы данных и вы хотите обрабатывать их все сразу. Postgres немного противно. То, что всегда работает, состоит в том, чтобы разбить одну большую миграцию на более мелкие шаги. Скорее всего, вы используете систему контроля версий.
Итак, имея описанную выше ситуацию, сделайте следующее:
И все готово.:)
Он должен работать безупречно.
Если вы используете версию django до 1.6, вам следует использовать отличный модуль xact.
xact - это рецепт обработки транзакций разумно в приложениях Django на PostgreSQL.
Примечание.. По состоянию на Django 1.6 функциональность xact будет объединена с ядром Django в качестве атомарного декоратора. Код, который использует xact, должен быть перенесен на атомарный с помощью простого поиска и замены. атомные работы в базах данных, отличных от PostgreSQL, являются потокобезопасными и имеют другие приятные функции; переключитесь на него, когда сможете!
Я добавляю следующее в свой файл настроек, потому что мне нравится функция autocommit, когда я "играю", но не хочу, чтобы он был активным, когда мой сайт работает иначе.
Итак, чтобы получить autocommit только в оболочке, я делаю этот маленький взлом:
import sys
if 'shell' in sys.argv or sys.argv[0].endswith('pydevconsole.py'):
DATABASES['default']['OPTIONS']['autocommit'] = True
ПРИМЕЧАНИЕ. Эта вторая часть только потому, что я работаю в PyCharm, которая напрямую не запускает manage.py
Я получил эту ошибку в Django 1.7. Когда я прочитал в документацию, которая
Эта проблема не может возникнуть в режиме Djangos по умолчанию и atomic() обрабатывает его автоматически.
Я немного подозрительно. Ошибки произошли, когда я попытался выполнить миграцию. Оказалось, что некоторые из моих моделей имели my_field = MyField(default=some_function)
. Если эта функция по умолчанию для поля работала хорошо с sqlite и mysql (у меня были некоторые ошибки импорта, но мне удалось заставить ее работать), хотя, похоже, это не работает для postgresql, и она сломала миграции до такой степени, что я не событие получило полезное сообщение об ошибке, но вместо этого было указано название вопроса.