2012-05-15 14 views
5

में ऑब्जेक्ट-आधारित डिफ़ॉल्ट मान 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

धन्यवाद। क्या यह 'ए' के उप-वर्गों के साथ भी काम करता है? – Debilski

+1

आह, 'propagate = True' तर्क के साथ काम करने लगता है। – Debilski

संबंधित मुद्दे