2012-05-15 14 views
5

Con SQLAlchemy, es posible agregar un valor predeterminado para cada función. Según tengo entendido, esto también puede ser invocable (ya sea sin argumentos o con un argumento ExecutionContext opcional).Valor predeterminado basado en objeto en SQLAlchemy declarativo

Ahora en un escenario declarativo, me pregunto si de alguna manera es posible tener una función predeterminada que se llama con el objeto que se está almacenando. Es decir. posiblemente así:

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 

¿Es esto posible? ¿O tengo que configurar de alguna manera un antes de la inserción gancho para esto (¿cómo?)?

Respuesta

4

before_insert está documentado aquí:

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

ejemplos aquí:

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

es decir

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

Gracias. ¿Esto también funciona con subclases de 'A'? – Debilski

+1

Ah, parece que funciona con el argumento 'propagate = True'. – Debilski

Cuestiones relacionadas