2011-01-15 2 views
0

Ich verwende SQLAlchemy in meinem Projekt.SQLAlchemy: Übergabe eines Parameters an das Objekt

ich zwei Klassen haben, rufen sie Bar und 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 aufgebaut ist, entweder von mir das Objekt direkt Konstruktion oder durch sqlalchemy beim Laden Foo aus der Datenbank-Objekte. Aber Foo braucht ein Bar-Objekt, um zu arbeiten. Aber wie bekomme ich den Bezug auf Bar ins Foo?

Normalerweise würde ich einfach die Bar in den Foo-Konstruktor übergeben. Dies wird jedoch hier nicht funktionieren, da SQLAlchemy das Objekt erstellt.

Ich möchte irgendwie eine Sitzung mit einem Bar-Objekt so konfigurieren, dass dieses Bar-Objekt in die Foo-Objekte injiziert wird, wenn sie der Sitzung hinzugefügt werden.

Was ich Versuchte

SQLAlchemy hat ein Veranstaltungs System. Eines der Sitzungsereignisse ist on_attach. Dies wird immer dann aufgerufen, wenn der Sitzung ein Objekt hinzugefügt wird. Es wird jedoch nicht aufgerufen, wenn ein Objekt aus der Datenbank geladen wird.

Es gibt Ereignisse, die beim Laden aus der Datenbank aufgerufen werden, aber auf einer Mapper-Basis. Das Bar-Objekt muss einer einzelnen Sitzung zugeordnet sein.

Antwort

0

Wenn Sie nur einen Bar für alle Foo s benötigen, können Sie eine Klasseneigenschaft oder eine Methode in Foo verwenden. Da Sie diesen offensichtlichen Weg nicht genommen haben, scheinen Sie für jedes neue Bar ein neues Foo zu konstruieren. Wahrscheinlich hat instrumentation die erforderlichen Ereignisse. Das Caching-Beispiel muss eine Möglichkeit haben, Ladeereignisse abzufangen.

+0

Ich brauche einen Balken pro sqlalchemy Sitzung. Ich kann die Last mit einem Instrumentierungsereignis abfangen, aber ich kann es nicht pro Sitzung anhängen. –

+0

Sobald Sie sich ein Session-Objekt ansehen, können Sie günstig prüfen, ob es einen zugehörigen Balken hat. Wenn dies nicht der Fall ist, können Sie direkt vor Ort eine Bar zuordnen. Wenn Sie eine Sitzung implizit erhalten, können Sie Ihren Code so modifizieren, dass eine Sitzung explizit zuerst aufgerufen und überprüft/repariert wird. Was ist falsch mit diesem Bild? – 9000

+0

Das Problem ist, dass ich durch eine Reihe von Reifen springen muss, damit diese Strategie funktioniert. Ich muss Sessions und Bars irgendwie "assoziieren". Ich muss eine Art Instrumentierung verwenden, um zu erkennen, wann ein neues Objekt konstruiert wird. All dies scheint eine Menge Code zu sein, um nur zusätzliche Parameter an das Objekt zu übergeben. Ich hatte gehofft, jemand könnte auf eine sauberere Art und Weise hinweisen. –