SQLAlchemy Trigger Event

ILOV-IT·2023년 10월 9일
0

트리거란 DB 테이블(뷰 포함)에 이벤트가 발생하였을 때 자동으로 실행되는 순차적인 코드를 말한다. 트리거는 데이터베이스의 무결정을 관리(maintain)하는 데 주로 사용된다. 예컨대, 신규 사원이 직원 테이블에 추가되었을 때, 그 사원 정보는 급여 테이블와 휴가 테이블, 세금 테이블에도 생성되어야 한다. 트리거는 직원들의 과거 급여를 추적하는 등의 로그 데이터에도 사용될 수 있다. (en.wikipedia.org/wiki/Database_trigger)

A database trigger is procedural code that is automatically executed in response to certain events on a particular table or view in a database. The trigger is mostly used for maintaining the integrity of the information on the database. For example, when a new record (representing a new worker) is added to the employees table, new records should also be created in the tables of the taxes, vacations and salaries. Triggers can also be used to log historical data, for example to keep track of employees' previous salaries.

SQLAlchemy에서도 트리거를 제공한다. 데이터베이스 트리거는 이벤트가 있을 발생하는 만큼, 공식문서(docs.sqlalchemy.org/en/20/orm/events.html)를 참고하여, 몇몇 이벤트를 정리해본다. (4가지 이벤트 중, Mapper Events만 살펴보자)

공식문서는 이벤트를 크게 4가지로 분류하고 있음
1) Session Events
2) Mapper Events 😀
3) Instance Event
4) Attribute Event
Mapper 이벤트는 13개가 있음
 1) MapperEvents.after_configured()
 2) MapperEvents.after_delete()
 3) MapperEvents.after_insert()
 4) MapperEvents.after_mapper_constructed()
 5) MapperEvents.after_update()
 6) MapperEvents.before_configured()
 7) MapperEvents.before_delete()
 8) MapperEvents.before_insert()
 9) MapperEvents.before_mapper_configured()
10) MapperEvents.before_update()
11) MapperEvents.dispatch
12) MapperEvents.instrument_class()
13) MapperEvents.mapper_configured()

1) MapperEvents.after_configured()

  • 정의 : configure_mappers() 함수가 실행되어 작업을 완료할 때 발생하는 이벤트
  • 발생시기
    1) Mappings이 처음 사용될 때
    2) 새로운 Mappers가 사용가능해지고 새로운 Mapper 사용이 감지될 때
  • 형태
    sqlalchemy.orm.MapperEvents.after_configured() → None
<공식문서 예시>

from sqlalchemy import event

@event.listens_for(SomeClass, 'after_configured')
def receive_after_configured():
    "listen for the 'after_configured' event"
    # ... (event handling logic) ...

2) MapperEvents.after_delete()

  • 정의 및 발생시기> DB에 저장된 값를 삭제하는 DELETE문이 발생한 후

  • 형태
    sqlalchemy.orm.MapperEvents.after_delete(mapper: Mapper[_O], connection: Connection, target: _O) → None**

  • 파라미터
    Mapper : 이벤트의 목표인 Mapper
    Connection : 해당 값을 삭제하기 위한 Delete문을 보낼 때, 사용하는 (DB) Connection
    Target : 삭제할 때 매핑된 값 (이벤트가 raw=True로 설정되어 있는 경우, InstanceState로 처리함)

<공식문서 예시>

from sqlalchemy import event

@event.listens_for(SomeClass, 'after_delete')
def receive_after_delete(mapper, connection, target):
    "listen for the 'after_delete' event"
    # ... (event handling logic) ...

| 참고 |

https://stackoverflow.com/questions/75883729/trigger-a-mapper-event-in-sqlalchemy-for-a-soft-delete-feature-mixin-class

profile
because we know you'll love it

0개의 댓글