2012-05-15 7 views
5

Avec SQLAlchemy, il est possible d'ajouter une valeur par défaut à chaque fonction. Si je comprends bien, cela peut aussi être un callable (soit sans arguments, soit avec un argument ExecutionContext optionnel).Valeur par défaut basée sur des objets dans SQLAlchemy déclaratif

Maintenant dans un scénario déclaratif, je me demande s'il est possible d'avoir une fonction par défaut qui est appelée avec l'objet qui est en cours de stockage. C'est à dire. éventuellement comme ceci:

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 

Est-ce quelque chose comme cela possible? Ou dois-je en quelque sorte mettre en place un avant-insertion crochet pour cela (comment?)?

Répondre

4

before_insert est documenté ici:

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

exemples ici:

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

à savoir

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

Merci. Est-ce que cela fonctionne également avec les sous-classes de 'A'? – Debilski

+1

Ah, semble fonctionner avec l'argument 'propager = True'. – Debilski

Questions connexes