Gewusst wie: laden von verschachtelten Beziehungen in SQLAlchemy?
Auf meine Pyramide+SQLAlchemy website möchte ich einen Kunden, um alle Einkäufe, die er abgegeben hat. Ein Kauf bietet viele Bestellung und eine Bestellung hat viele PurchaseOrderDetail.
Möchte ich, um alle Kauf-Kontext (einschließlich Bestellungen und details) in einer optimierten Art und Weise und deshalb bin ich auf der Suche bei SQLAlchemy laden-Strategien.
Mein Modell Deklaration sieht wie folgt aus:
class Purchase(Base):
__tablename__ = 'purchase'
__table_args__ = {'schema':'db','autoload':True}
customer = relationship(Customer)
billing_address = relationship(Address,primaryjoin="Address.AddressId==Purchase.BillingAddressId")
shipping_address = relationship(Address,primaryjoin="Address.AddressId==Purchase.ShippingAddressId")
orders = relationship(PurchaseOrder)
class PurchaseOrder(Base):
__tablename__ = 'purchase_order'
__table_args__ = {'schema':'db','autoload':True}
company = relationship(Company)
delivery_service = relationship(DeliveryService)
details = relationship(PurchaseOrderDetail)
class PurchaseOrderDetail(Base):
__tablename__ = 'purchase_order_detail'
__table_args__ = {'schema':'db','autoload':True}
product_variant = relationship(ProductVariant)
Und was ich möchte, ist etwas in dieser form:
db_session = DBSession()
p = db_session.query(Purchase).\
options(joinedload_all(Purchase.customer,
Purchase.billing_address,
Purchase.shipping_address)
,subqueryload_all(Purchase.orders,
Purchase.orders.details)).all()
Jedoch die Purchase.orders.details
Teil ist nicht zulässig, und die folgende Ausnahme ausgelöst:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\apps\pyramid\lib\site-packages\sqlalchemy\orm\attributes.py", line 139, in __getattr__
key)
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'details'
So, meine Fragen sind:
- Wie kann ich laden Sie die PurchaseOrderDetails beim Abfragen der Kauf
Modell? - Ist dies der beste Weg, um alle Kaufen conext?
Vielen Dank im Voraus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Änderung der
subqueryload_all(...)
Teil der Abfrage auf eine der beiden folgenden Optionen wird die Arbeit machen:Dokumentation auf
sqlalchemy.orm.subqueryload_all
ist ziemlich klar, auf das in den Beispielen aufgeführt.Meine Entschuldigungen, wie ich nicht kommentieren, oft in Stack-Überlauf, so bin ich nicht sicher, ob dies ist, wo ich posten soll.
FYI, sqlalchemy.orm.subqueryload_all ist veraltet (seit version 0.9.0).
Wollen Sie Euch jetzt verwenden Sie die Methode der Verkettung.