2012-09-20 106 views
4

我正在尋找鉤入sqlalchemy模型的模型創建週期。例如在創建或保存(例如在Ruby ORM ActiveRecord中,實際上我將模型從ActiveRecord移動到SqlAlchemy)。掛鉤到sqlalchemy模型

事件看起來像我需要的:http://docs.sqlalchemy.org/en/rel_0_7/core/event.html,但我還沒有找到更詳細的例子。我想聽聽有人有這方面的經驗。

在sqlalchemy中是否有類似的工具來處理基於特定線索的模型/實例,例如: after_create?

回答

14

事情很簡單,一旦你掌握了它。 下面是一個使用事件

import uuid  

from sqlalchemy.event import listen 

from mypackage.models import Base 


def generate_license(mapper, connect, target): 
    target.generate_license() 

class User(Base): 
    __tablename__ = "users" 
    id = Column(String(36)) 
    license = Column(String(256)) 

    def generate_license(self): 
     if not self.license: 
      self.license = str(uuid.uuid4()) 
     return self.license 

listen(User, 'before_insert', generate_license) 

或者,你可以使用裝飾一個簡單的例子:

from sqlalchemy.event import listens_for 
… 
class User(Base): 
    … 

@listens_for(User, 'before_insert') 
def generate_license(mapper, connect, self): 
    … 
8
from sqlalchemy.event import listen_for 
… 
class User(Base): 
… 
    @listen_for(User, 'before_insert') 
    @staticmethod 
    def generate_license(mapper, connect, self): 
… 

這將返回

NameError: name 'User' is not defined 
+0

請查看更新的答案 – amigcamel