SQLAlchemy:将参数传递给对象

时间:2011-01-15 15:25:36

标签: python dependency-injection sqlalchemy

我在我的项目中使用SQLAlchemy。

我有两个班,称他们为Bar和Foo

class Bar(object):
    def valueize(self, name):
         # do some crazy magic
         return value


class Foo(Base):
   id = Column(...
   name = Column(...

   @property
   def value(self):
       return self._bar.valueize(self.name)

Foo是由我直接构造对象构建的,或者是在从数据库加载Foo对象时由SQLalchemy构造的。但是Foo需要一个Bar对象才能工作。但是如何将Bar引用到Foo中呢?

通常,我只是将Bar传递给Foo构造函数。但是,这在这里不起作用,因为SQLAlchemy正在创建对象。

我希望能够以某种方式配置一个带有Bar对象的Session,以便在将这些bar对象添加到会话时将其注入Foo对象。

我尝试过什么

SQLAlchemy有一个事件系统。其中一个会话事件是on_attach。只要将对象添加到会话中,就会调用此方法。但是,从数据库加载对象时不会调用它。

从数据库加载时会调用某些事件,但它们是基于每个映射器的。 Bar对象需要与单个会话相关联。

1 个答案:

答案 0 :(得分:0)

如果您对所有Bar只需要一个Foo,则可以在Foo中使用类属性或方法。由于您没有采用这条明显的路径,因此您似乎需要为每个新Bar构建一个新的Foo。可能instrumentation有所需的事件。缓存示例必须有一种方法来拦截加载事件。