Я получил много ошибок с сообщением:
"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"
после изменения с python-psycopg на python-psycopg2 в качестве движка базы данных проекта Django.
Код остается прежним, просто не знаю, откуда эти ошибки.
python
django
postgresql
psycopg2
разъем
источник
источник
conn.rollback()
(где conn - ваш объект соединения), то ошибка будет сброшена, и вы сможете запускать другие запросыОтветы:
Это то, что делает postgres, когда запрос выдает ошибку, и вы пытаетесь выполнить другой запрос без предварительного отката транзакции. (Вы можете думать об этом как о функции безопасности, чтобы не повредить ваши данные.)
Чтобы это исправить, вам нужно выяснить, где в коде выполняется неверный запрос. Может быть полезно использовать опции log_statement и log_min_error_statement на вашем сервере postgresql.
источник
Чтобы избавиться от ошибки, откатите последнюю (ошибочную) транзакцию после исправления кода:
Вы можете использовать try-кроме, чтобы предотвратить возникновение ошибки:
См. Документацию Django
источник
IntegrityError
а не базовый классDatabaseError
?Итак, я столкнулся с этой же проблемой. Проблема, с которой я столкнулся, заключалась в том, что моя база данных не была должным образом синхронизирована. Простые проблемы всегда, кажется, вызывают наибольшее беспокойство ...
Чтобы синхронизировать вашу django db, из каталога вашего приложения в терминале введите:
Изменить: Обратите внимание, что если вы используете django-south, запуск команды '$ python manage.py migrate' также может решить эту проблему.
Удачного кодирования!
источник
python manage.py migrate <app>
... для всех моих приложений.django-south
-migrate
команда не встроена в Django.В Flask вам просто нужно написать:
PS Документация находится здесь https://www.postgresql.org/docs/9.4/static/sql-rollback.html
источник
По моему опыту, эти ошибки происходят следующим образом:
Во втором запросе нет ничего плохого, но, поскольку обнаружена реальная ошибка, второй запрос вызывает ошибку (гораздо менее информативную).
редактировать: это происходит только в том случае, если
except
условие ловитIntegrityError
(или любое другое исключение базы данных низкого уровня), если вы поймаете что-то подобное,DoesNotExist
эта ошибка не возникнет, потомуDoesNotExist
что не повредит транзакциюУрок здесь - не пытайтесь / кроме / проходите.
источник
Я думаю, что шаблон, который упоминает priestc, скорее всего, является обычной причиной этой проблемы при использовании PostgreSQL.
Тем не менее, я чувствую, что есть законные варианты использования шаблона, и я не думаю, что эта проблема должна быть причиной, чтобы всегда избегать ее. Например:
Если вы чувствуете себя нормально с этим шаблоном, но хотите избежать повсеместного использования явного кода обработки транзакций, то вам может потребоваться включить режим автоматической фиксации (PostgreSQL 8.2+): https://docs.djangoproject.com/en/ DEV / исх / базы данных / # автокоммит-режим
Я не уверен, если есть важные соображения производительности (или любого другого типа).
источник
Если вы получили это, находясь в интерактивной оболочке, и хотите быстро исправить это, сделайте следующее:
изначально видел в этом ответе
источник
Я столкнулся с аналогичным поведением при выполнении сбой транзакции на
postgres
терминале. Ничего не прошло после этого, так какdatabase
находится в состоянииerror
. Тем не менее, просто как быстрое решение, если вы можете позволить себе избежатьrollback transaction
. Следующее сделало трюк для меня:COMMIT;
источник
У меня проблема с силимаром. Решение было перенести дБ (
manage.py syncdb
илиmanage.py schemamigration --auto <table name>
если вы используете юг).источник
просто используйте откат
Пример кода
источник
У меня тоже была эта ошибка, но она маскировала еще одно более важное сообщение об ошибке, в котором код пытался сохранить строку из 125 символов в столбце из 100 символов:
Мне пришлось отлаживать код, чтобы появилось указанное выше сообщение, иначе оно отображает
источник
В ответ на @priestc и @Sebastian, что если вы сделаете что-то подобное?
Я только что попробовал этот код, и он, кажется, работает, молча терпит неудачу, не заботясь о возможных ошибках, и работает, когда запрос хорош.
источник
Я считаю, что ответ @ AnujGupta правильный. Однако откат сам может вызвать исключение, которое вы должны перехватить и обработать:
Если вы обнаружите, что переписываете этот код в разных
save()
местах, вы можете извлечь метод:Наконец, вы можете предварительно защитить его, используя декоратор, который защищает методы, которые используют
save()
:Даже если вы реализуете описанный выше декоратор, его все равно удобно использовать
try_rolling_back()
в качестве извлеченного метода на тот случай, если вам понадобится использовать его вручную в тех случаях, когда требуется особая обработка, а общая обработка декоратора недостаточна.источник
Это очень странное поведение для меня. Я удивлен, что никто не думал о точках сохранения. В моем коде ошибочный запрос был ожидаемым поведением:
Я изменил код таким образом, чтобы использовать точки сохранения:
источник
В оболочке Flask все, что мне нужно было сделать, это
session.rollback()
пройти через это.источник
Я встретил эту проблему, ошибка выходит , так как сделки , ошибки не закончилось правильно, я обнаружил , что
postgresql_transactions
команды управления транзакций здесьКонтроль транзакций
Следующие команды используются для управления транзакциями
поэтому я использую
END TRANSACTION
для завершения ошибки транзакции, код, подобный этому:источник
Вы можете отключить транзакцию через "set_isolation_level (0)"
источник