[python] DatabaseError : 현재 트랜잭션이 중단되고 트랜잭션 블록이 끝날 때까지 명령이 무시됩니까?

메시지에 많은 오류가 있습니다.

"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"

Django 프로젝트의 데이터베이스 엔진으로 python-psycopg에서 python-psycopg2로 변경된 후.

코드는 동일하게 유지되며 오류의 출처를 모릅니다.



답변

이것은 쿼리에서 오류가 발생하고 트랜잭션을 먼저 롤백하지 않고 다른 쿼리를 실행하려고 할 때 postgres가 수행하는 작업입니다. 데이터를 손상시키지 않도록 안전 기능으로 생각할 수 있습니다.

이 문제를 해결하려면 코드에서 잘못된 쿼리가 실행되는 위치를 파악해야합니다. postgresql 서버에서 log_statementlog_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()

이 답변 에서 원래 본