2012-05-15 11 views
5

SQLAlchemyを使用すると、すべての関数に既定値を追加することができます。私が理解しているように、これは呼び出し可能(引数を持たないか、オプションの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

関連する問題