2011-01-15 14 views
0

私のプロジェクトでSQLAlchemyを使用しています。SQLAlchemy:オブジェクトにパラメータを渡す

私は2つのクラスを持って、Fooのは、それがデータベースからのFooオブジェクトをロードするとき、直接またはSQLAlchemyのでオブジェクトを構築し、私のいずれかによって構成され

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は動作させるにはBarオブジェクトが必要です。しかし、バーへの参照をFooにどのように取得するのですか?

通常、私はBarをFooコンストラクタに渡します。ただし、SQLAlchemyがオブジェクトを作成しているため、ここでは機能しません。

私ができるようにしたいのは、バーオブジェクトがセッションに追加されるときにそのバーオブジェクトがFooオブジェクトに注入されるように、何らかの形でセッションを構成することです。

私が試した何

SQLAlchemyのは、イベントシステムを持っています。セッションイベントの1つはon_attachです。これは、オブジェクトがセッションに追加されるたびに呼び出されます。ただし、オブジェクトがデータベースからロードされたときは呼び出されません。

データベースからロードされたときに呼び出されるイベントがありますが、それらはマッパー単位で発生します。 Barオブジェクトは個々のセッションに関連付ける必要があります。

答えて

0

すべてFooに1つのBarが必要な場合は、Fooのクラスプロパティまたはメソッドを使用できます。あなたはこの明白な道を取っていないので、新しいFooごとに新しいBarを構築する必要があるようです。おそらくinstrumentationに必要なイベントがあります。キャッシングの例には、ロードイベントをインターセプトする方法が必要です。

+0

sqlalchemyセッションごとに1つのバーが必要です。インストゥルメンテーションイベントで負荷を捕まえることはできますが、セッションごとに取り付けることはできません。 –

+0

Sessionオブジェクトを見ると、関連付けられたBarがあるかどうかを安価に確認できます。そうでない場合は、その場でバーを右に関連付けることができます。 Sessionを暗黙的に取得した場合は、セッションを明示的に取得してチェック/修正するようにコードを変更できます。この写真の何が間違っていますか? – 9000

+0

問題は、その戦略を働かせるためにいくつかのフープを飛ばしなければならないことです。私は何とかセッションとバーを "関連付ける"必要があります。私は新しいオブジェクトが構築されているときを検出するためにある種の計測を使用する必要があります。このすべては、オブジェクトに余分なパラメータを渡したいだけのコードのようです。私は、誰かがそれを行うよりきれいな方法を指摘することを望んでいた。 –

関連する問題