2016-06-09 2 views
1

우리의 장고 사이트를 1.4에서 1.9로 업그레이드하고 있습니다. pull a github으로 지정하고 laboratory을 사용하여 업그레이드 된 사이트를 기존 프로덕션 사이트와 비교하여 테스트하십시오. 그러나 명백한 이유로 인해 (포스트그레스) 프로덕션 데이터베이스에 새로운 사이트를 작성할 수는 없습니다.미들웨어로 모든 Django db 트랜잭션을 롤백합니다.

이제는이 읽기 전용 인스턴스에 readonly db 권한을 부여 하겠지만 모든 쓰기에 대해 오류를 발생시킬 수는 없습니다. 문제의 데이터베이스 연결을 ATOMIC_REQUESTS = True을 사용하도록 설정해야하고 모든 요청이 끝날 때 트랜잭션을 롤백하기 위해 미들웨어를 작성해야하지만 Django의 트랜잭션 처리에서 변경된 사항은 1.4가 아니므로 그 미들웨어를 구현하는 가장 좋은 방법은 확실합니다.

모든 트랜잭션을 확실하게 롤백하기 위해 미들웨어를 작성하는 방법은 무엇입니까?

답변

1

오른쪽 점은 = 설정 ATOMIC_REQUESTS보다는 AUTOCOMMIT=False을 설정 True 인

할 수 있습니다 구성에서 False로 AUTOCOMMIT을 설정하여 주어진 데이터베이스에 대한 완전히 비활성화 장고의 트랜잭션 관리. 이렇게하면 장고는 자동 커밋을 사용하지 않으며 어떤 커밋도 수행하지 않습니다. 기본 데이터베이스 인 라이브러리의 정규 동작을 가져옵니다. 이렇게하면 Django 또는 타사 라이브러리에서 시작한 트랜잭션을 명시 적으로 커밋해야합니다. 따라서 은 자신의 트랜잭션 제어 미들웨어를 실행하거나 정말로 이상한 일을하고 싶은 상황에서 가장 잘 사용됩니다.

모든 것을 커밋하지 않으면 아무 것도 실제로 데이터베이스에 들어 가지 않습니다. 데이터베이스 백업 세션을 사용하는 경우 수동 커밋을 수행해야하지만 나머지는 그대로 두어야합니다. 그러면 라이브 서버의 모든 데이터가 수정되지 않습니다. 다음과 같이

AUTOCOMMIT = 거짓은 settings.py로 전환 :

DATABASE = { 
    'default': { /* other stuff */, 
     AUTOCOMMIT: False, 
    } 
} 

이 방식은 사용자 정의 미들웨어의 생성을 포함하지 않습니다. 아주 쉽게 켜고 끌 수 있습니다.

+0

브릴리언트. 나는 그것을 시도 할 것이다. 하나의 질문 : 비록 트랜잭션을 롤백하지 않고 커밋하지 않는다면, 장고가 지속적으로 연결된다는 점에 대해 걱정할 필요가 있습니까? –

+0

당신이 수천 건의 거래를하지 않았기 때문에 테스트 목적으로 실제로 알지 못하는 건 제가 중요하다고 생각하지 않습니다. BTW, 수동으로 롤백 할 필요가 없습니다. – e4c5

+0

아직 얻지 못했습니다 - 다른 우선 순위가 나타났습니다. :) 한번 시도해 보니 다시 확인해 보겠습니다. 아마도이 시점에서 2 ~ 3 주 정도 걸릴 것입니다. –

관련 문제