메시지에 많은 오류가 있습니다.
"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"
Django 프로젝트의 데이터베이스 엔진으로 python-psycopg에서 python-psycopg2로 변경된 후.
코드는 동일하게 유지되며 오류의 출처를 모릅니다.
답변
이것은 쿼리에서 오류가 발생하고 트랜잭션을 먼저 롤백하지 않고 다른 쿼리를 실행하려고 할 때 postgres가 수행하는 작업입니다. 데이터를 손상시키지 않도록 안전 기능으로 생각할 수 있습니다.
이 문제를 해결하려면 코드에서 잘못된 쿼리가 실행되는 위치를 파악해야합니다. postgresql 서버에서 log_statement 및 log_min_error_statement 옵션 을 사용하는 것이 도움이 될 수 있습니다 .
답변
오류를 제거하려면 코드를 수정 한 후 마지막 (잘못된) 트랜잭션을 롤백 하십시오.
from django.db import transaction
transaction.rollback()
try-except를 사용하여 오류가 발생하지 않도록 할 수 있습니다.
from django.db import transaction, DatabaseError
try:
a.save()
except DatabaseError:
transaction.rollback()
참조 : Django documentation
답변
그래서 나는이 같은 문제에 부딪쳤다. 내가 가진 문제는 데이터베이스가 올바르게 동기화되지 않았다는 것입니다. 간단한 문제는 항상 가장 성가신 것 같습니다 …
django db를 동기화하려면 앱 디렉토리 내 터미널에서 다음을 입력하십시오.
$ python manage.py syncdb
편집 : django-south를 사용하는 경우 ‘$ python manage.py migrate’명령을 실행하면이 문제가 해결 될 수 있습니다.
행복한 코딩!
답변
플라스크에서는 다음과 같이 작성하면됩니다.
curs = conn.cursor()
curs.execute("ROLLBACK")
conn.commit()
PS 설명서는 여기에 있습니다 https://www.postgresql.org/docs/9.4/static/sql-rollback.html
답변
내 경험상 이러한 오류는 다음과 같이 발생합니다.
try:
code_that_executes_bad_query()
# transaction on DB is now bad
except:
pass
# transaction on db is still bad
code_that_executes_working_query() # raises transaction error
두 번째 쿼리에는 아무런 문제가 없지만 실제 오류가 발생했기 때문에 두 번째 쿼리는 (정보가 부족한) 오류를 발생시키는 쿼리입니다.
편집 : 이것은 except
절이 catch IntegrityError
(또는 다른 저수준 데이터베이스 예외) 인 경우 에만 발생합니다. DoesNotExist
이 오류 와 같은 것을 포착 DoesNotExist
하면 트랜잭션이 손상되지 않기 때문에 발생 하지 않습니다.
여기서 교훈은 시도 / 제외 / 통과하지 않습니다.
답변
PostgreSQL을 사용할 때 패턴 priric 언급 이이 문제의 일반적인 원인 일 가능성이 더 큽니다.
그러나 패턴에 대한 올바른 사용법이 있다고 생각 하며이 문제가 항상 피해야하는 이유는 아니라고 생각합니다. 예를 들면 다음과 같습니다.
try:
profile = user.get_profile()
except ObjectDoesNotExist:
profile = make_default_profile_for_user(user)
do_something_with_profile(profile)
이 패턴으로 괜찮다고 느끼지만 어디서나 명시 적 트랜잭션 처리 코드를 피하려면 자동 커밋 모드 (PostgreSQL 8.2 이상)를 켜고 싶을 수 있습니다. https://docs.djangoproject.com/en/ dev / ref / databases / # autocommit-mode
DATABASES['default'] = {
#.. you usual options...
'OPTIONS': {
'autocommit': True,
}
}
중요한 성능 고려 사항 (또는 다른 유형)이 있는지 확실하지 않습니다.
답변
대화식 쉘에있는 동안이 문제가 발생하고 빠른 수정이 필요한 경우 다음을 수행하십시오.
from django.db import connection
connection._rollback()
이 답변 에서 원래 본