【问题标题】:Object-based default value in SQLAlchemy declarativeSQLAlchemy 声明式中基于对象的默认值
【发布时间】:2012-05-22 21:13:45
【问题描述】:

使用 SQLAlchemy,可以为每个函数添加默认值。据我了解,这也可能是可调用的(没有任何参数或带有可选的 ExecutionContext 参数)。

现在在声明性场景中,我想知道是否有可能以某种方式使用正在存储的 object 调用的默认函数。 IE。可能是这样的:

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 挂钩(如何?)?

【问题讨论】:

    标签: python sqlalchemy hook


    【解决方案1】:

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2018-12-22
      • 2016-11-17
      • 2021-09-17
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      相关资源
      最近更新 更多