콘텐츠로 이동

거래

비동기 쿼리를 발행하는 데 사용되는 인코딩/데이터베이스로 인해 데이터베이스 트랜잭션이 지원됩니다.

기본 용도

트랜잭션을 사용하려면 ase.를 비동기 컨텍스트 관리자로 사용하십시오.

1
2
3
4
5
데이터베이스 트랜잭션과 비동기화():
    # 여기에서 호출되는 모든 것은 하나의 거래가 될 것입니다.
    모델 1()을 기다립니다.저장()
    모델 2()를 기다립니다.저장()
    ...

!!!모델의 ormar_config 개체에 사용된 것과 동일한 데이터베이스여야 합니다.

코드에서 데이터베이스 인스턴스가 전달되지 않도록 각 모델에서 인스턴스를 추출할 수 있습니다. ormar 동안 제공된 데이터베이스. 모델 선언은 ormar_config를 통해 사용할 수 있으며 클래스 및 인스턴스에서 액세스할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
데이터베이스 가져오기
sqlalchemy 가져오기
오마르 가져오기


base_ormar_config = OrmarConfig (
    메타데이터 = sqlalchemy. 메타데이터(),
    데이터베이스 = 데이터베이스. 데이터베이스("sqlite://"),
)


클래스 작성자(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 255)

# 데이터베이스는 클래스에서 액세스할 수 있습니다.
데이터베이스 = 작성자 ormar_config 데이터베이스

# 인스턴스뿐만 아니라
저자 = 저자 (이름 = "스티븐 킹")
데이터베이스 = . ormar_config

.()를 비동기 함수의 함수 데코레이터로 사용할 수도 있습니다.

1
2
3
@ase. ()
비동기 def create_(요청):
    ...

트랜잭션 블록은 태스크 로컬 상태로 관리됩니다. 중첩된 트랜잭션은 데이터베이스 저장 지점을 사용하여 완전히 지원되고 구현됩니다.

수동 커밋/롤백

낮은 수준의 거래 API의 경우 수동으로 트리거할 수 있습니다.

1
2
3
4
5
6
7
8
트랜잭션 = 데이터베이스를 기다립니다. 트랜잭션()
시도:
    거래 대기 중. 시작 ()
    ...
제외:
    거래 대기 중. 롤백 ()
기타:
    거래 대기 중. 커밋()

테스트

트랜잭션은 강제 롤백을 적용할 수 있고 각 테스트 후에 데이터를 정리할 필요가 없는 테스트 중에도 유용합니다.

1
2
3
4
5
6
@Pytest.mar.asyncio
Async def sample_est ():
    데이터베이스와 비동기화:
        ase.와 비동기화(force_roll back = True):
            # 여기 테스트 코드
            ...