使用SqlAlchemy在__init__上一致地应用东西

时间:2011-07-30 23:37:06

标签: python sqlalchemy

假设我有这样的事情:

def Tab(Base):
  a = 'a'
  b = 'b'
  c = 'c'

  def __init__(self):
    self.c_a = DBSession.query(Table2).filter(Table2.a == self.a).all()

似乎self.c_a仅适用于我插入的项目。我想确保__init__中指定的操作(这只是一个可能通过relationship()更好地完成的示例,但使用您的想象力)适用于所有对象,包括SA查询出来的对象数据库。有谁知道怎么做?

我觉得我可能会误解某些东西,如果是这样,请纠正我。

3 个答案:

答案 0 :(得分:5)

答案 1 :(得分:5)

从模型内部引用数据库是一个抽象泄漏;模型不应该知道它们可能存在的持久性的细节;它们可能根本不存在(它们毕竟是模型,可能用于任何类型的计算。)

尝试与其他实体建立关联时,应始终使用relationship(),无论是否存在基础持久性存储,它都可以正常工作。更重要的是,当您使用SQLAlchemy进行动态生成的查询时,关系非常有用;在模型方法中执行查询不允许这种灵活性。

如果您确定需要在模型层(而不是通常应该是控制器层)上进行会话,那么您当然不应使用全局会话实例;总是从对象本身计算会话:

class MyModel(Base):
    def frobnicate(self):
        session = sqlalchemy.orm.Session.object_session(self)
        if session is None:
            raise ValueError("not connected to a session")
        session.query(...)

答案 2 :(得分:1)

您是对的,当使用SA会话加载对象时,不会调用__init__ 要在其他情况下执行代码,请使用Instance Events。我想load在你的情况下特别有用,但refresh也可能有用。