2012-05-15 4 views
5

SQLAlchemy를 사용하면 모든 함수에 기본값을 추가 할 수 있습니다. 내가 이해하는 한, 이것은 callable (인수가 없거나 선택적 ExecutionContext 인수를 가짐) 일 수도있다.SQLAlchemy의 개체 기반 기본값

이제는 선언적 시나리오에서 개체 인이 저장되는 기본 함수를 어떻게 든 가질 수 있는지 궁금합니다. 나는. 이렇게 좋을 수도 있습니다 :

Base = sqlalchemy.ext.declarative.declarative_base() 
class BaseEntity(Base): 
    value = Column('value', String(40), default=BaseEntity.gen_default) 

    def gen_default(self): 
     # do something with self, for example 
     # generate a default value using some other data 
     # attached to the object 
     return self.default_value 

이렇게 할 수 있습니까? 또는 어떻게 든 어떻게 이런 식으로 을 삽입해야합니까? 후크 (어떻게?)?

답변

4

before_insert 여기서 설명되어

http://docs.sqlalchemy.org/en/rel_0_7/orm/events.html#sqlalchemy.orm.events.MapperEvents.before_insert

예 : 여기

http://docs.sqlalchemy.org/en/rel_0_7/orm/events.html#mapper-events

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import event 

Base= declarative_base() 

class A(Base): 
    __tablename__ = "a" 


    id = Column(Integer, primary_key=True) 
    data = Column(String) 
    otherdata = Column(String) 

@event.listens_for(A, "before_insert") 
def gen_default(mapper, connection, instance): 
    instance.data = "Some default %s" % instance.otherdata 

e = create_engine("sqlite://") 
Base.metadata.create_all(e) 

a = A(otherdata="some other data") 
s = Session(e) 
s.add(a) 
s.commit() 

assert a.data == "Some default some other data" 
+0

감사. 이것은'A'의 서브 클래스에서도 작동합니까? – Debilski

+1

아,'propagate = True' 인수로 작동하는 것 같습니다. – Debilski