본문 바로가기

Dev./Google App Engine

Datastore - NDB API(Python) : Model Hooks 사용하기 (trigger 역할)

DB에 어떤 작업을 하고난 이후 (또는 하기전에) 어떤 다른 작업이 자동으로 실행되도록 프로그래밍 할때 Hook를 사용한다.



간단한 사용법은 ndb.Model 클래스에 정의된 hook 함수를 오버라이드 하면 된다.


hook 함수 목록은 아래와 같다.

@classmethod
  def _pre_allocate_ids_hook(cls, size, max, parent):

  @classmethod
  def _post_allocate_ids_hook(cls, size, max, parent, future):

  @classmethod
  def _pre_delete_hook(cls, key):

  @classmethod
  def _post_delete_hook(cls, key, future):

  @classmethod
  def _pre_get_hook(cls, key):

  @classmethod
  def _post_get_hook(cls, key, future):

  def _pre_put_hook(self):

  def _post_put_hook(self, future):

함수 명만 봐도 대충 알거 같다.




사용 예

Account를 입력하고 삭제할 때 마다 Event를 기록하는 Hook를 작성해보자

# Event 모델을 정의하고
class Event(ndb.Model):
    kind = ndb.StringProperty()
    event = ndb.StringProperty()
    desc = ndb.StringProperty()

# Account 모델에 Hook를 정의하자
class Account(ndb.Model):
    username = ndb.StringProperty()
    userid = ndb.IntegerProperty()
    email = ndb.StringProperty()
    
    def _post_put_hook(self, future):
        e = Event(kind='Account', event='put', desc='put ' + str(self.userid))
        e.put()
    
    @classmethod
    def _pre_delete_hook(cls, key):
        e = Event(kind='Account', event='del', desc='delete ' + str(key.get().userid))
        e.put()
    
    
sally = Account()
sally.populate(username='Sally', userid=456, email='sally@gmail.com', key=ndb.Key('Account', 'Sally1'))
#sally를 만들었다 지우면 입력 데이터와 삭제 데이터가 입력됨을 확인 할 수 있다.
sally_key = sally.put()
sally_key.delete()

Google App Engine Console에서 확인해보면 잘 돌아가는 것을 알 수 있다.


반응형