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.
Ich brauche einen Balken pro sqlalchemy Sitzung. Ich kann die Last mit einem Instrumentierungsereignis abfangen, aber ich kann es nicht pro Sitzung anhängen. –
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
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. –