Вопрос по python – Объектное значение по умолчанию в декларативной SQLAlchemy

5

С помощью SQLAlchemy можно добавить значение по умолчанию для каждой функции. Насколько я понимаю, это также может быть вызвано (либо без каких-либо аргументов, либо с необязательным аргументом ExecutionContext).

Теперь в декларативном сценарии мне интересно, возможно ли каким-то образом иметь функцию по умолчанию, которая вызывается сobject это хранится. То есть возможно так:

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

Возможно ли что-то подобное? Или я должен как-то настроитьbefore-insertion зацепить за это (как?)?

Ваш Ответ

1   ответ
4

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"
Благодарю. Это также работает с подклассамиA? Debilski
Ах, похоже, работает сpropagate=True аргумент. Debilski

Похожие вопросы