2012-09-28 48 views
1

我想分享在我的所有車型的簡單功能(時間戳),並正在與「增強基地」的方式去作爲SQLA文檔描述共享的事件處理程序。到目前爲止,我這樣做:所有車型

import sqlalchemy as sa 
from datetime import datetime as dt 

class EntityBase(object): 

    @declared_attr 
    def __tablename__(cls): 
     return cls.__name__.lower() 

    id = sa.Column(sa.Integer, primary_key=True) 
    last_update = sa.Column(sa.DateTime, default=dt.utcnow()) 

def update_entity(mapper, connection, target): 
    target.last_update = dt.utcnow() 


Entity = declarative_base(cls=EntityBase) 

sa.event.listen(Entity, 'before_insert', update_entity) 
sa.event.listen(Entity, 'before_update', update_entity) 

我的所有型號均來自Entity類派生。但在運行時我得到sqlalchemy.orm.exc.UnmappedClassError: Class 'sqlalchemy.ext.declarative.Base' is not mapped。我究竟做錯了什麼?

UPDATE 我已經做簡單的預處理,這樣規避了問題:

def setupEntities(): 
    ... 
    for cls in Entity.__subclasses__(): 
     listen(cls, 'before_insert', update_entity) 
     listen(cls, 'before_update', update_entity) 
    ... 

...但我想聽聽關於做正確的方式。

回答

1

這裏有趣的是,這樣你做到了以上可能應該工作。這將是方便的。所以我已經爲http://www.sqlalchemy.org/trac/ticket/2585添加了一張票。

現在,一種方法可以做到這一點是設置新映射事件偵聽器與底邊沿着:如果我實現該功能爲#2585我可能得其實

Entity = declarative_base(cls=EntityBase): 

from sqlalchemy.orm import mapper 
@event.listens_for(mapper, 'mapper_configured') 
def set_events(mapper, class_): 
    if issubclass(class_, Entity): 
     listen(class_, 'before_update', update_entity) 
     listen(class_, 'before_insert', update_entity) 

這樣做也非常類似。

+0

到目前爲止,我的辦法是工作正常,但我會努力也是你,謝謝。 – AlexVhr