2012-05-15 3 views
5

Mit SQLAlchemy ist es möglich, jeder Funktion einen Standardwert hinzuzufügen. Wie ich es verstehe, kann dies auch aufrufbar sein (entweder ohne Argumente oder mit einem optionalen ExecutionContext-Argument).Objektbasierter Standardwert in SQLAlchemy deklarativ

Jetzt in einem deklarativen Szenario frage ich mich, ob es irgendwie möglich ist, eine Standardfunktion zu haben, die mit dem Objekt aufgerufen wird, das gespeichert wird. I.e. möglicherweise so:

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 

Ist so etwas möglich? Oder muss ich irgendwie einen vor-Einfügung Haken für diese (wie?) Einrichten?

Antwort

4

before_insert ist hier dokumentiert:

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

Beispiele hier:

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

heißt

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

Dank. Funktioniert das auch mit Unterklassen von 'A'? – Debilski

+1

Ah, scheint mit dem 'propagate = True' Argument zu arbeiten. – Debilski