SQLAlchemy:向对象传递参数

0 投票
1 回答
1022 浏览
提问于 2025-04-16 10:01

我在我的项目中使用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这个对象可以通过我直接创建,或者通过SQLAlchemy从数据库加载Foo对象来构建。但是,Foo需要一个Bar对象才能正常工作。那么,我该怎么把Bar的引用放到Foo里呢?

通常情况下,我会直接把Bar传给Foo的构造函数。但是在这里不行,因为是SQLAlchemy在创建这个对象。

我想要做的是,能够以某种方式配置一个Session,让Bar对象在添加Foo对象到这个Session时被注入到Foo里。

我尝试过的

SQLAlchemy有一个事件系统。其中一个会话事件是on_attach。每当一个对象被添加到会话时,这个事件就会被调用。但是,当一个对象从数据库加载时,这个事件不会被调用。

确实有一些事件是在从数据库加载时被调用的,但它们是针对每个映射器的。Bar对象需要与一个特定的会话关联起来。

1 个回答

0

如果你只需要一个 Bar 来服务所有的 Foo,你可以在 Foo 里面使用一个类属性或者方法。既然你没有选择这个明显的办法,看来你是想为每一个新的 Foo 创建一个新的 Bar。可能 instrumentation 有你需要的事件。缓存的例子必须有一种方法来拦截加载事件。

撰写回答