SQLAlchemy lädt eifrig mehrere Beziehungen auf

SQLAlchemy unterstützt eifrige Last für die Beziehung, es ist im Grunde einJOIN Erklärung. Wenn ein Modell jedoch zwei oder mehr Beziehungen hat, kann es sich um eine sehr große Verknüpfung handeln. Beispielsweise

class Product(Base):
    __tablename__ = 'product'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(255), nullable=False)
    orders = relationship('Order', backref='product', cascade='all')
    tags = relationship('Tag', secondary=product_tag_map)

class Order(Base):
    __tablename__ = 'order'
    id = Column(Integer, primary_key=True, autoincrement=True)
    date = Column(TIMESTAMP, default=datetime.now())

class Tag(Base):
    __tablename__ = 'tag'
    id = Column(Integer, primary_key=True, autoincrement=True)
    tag_type = Column(String(255), nullable=False)
    tag_value = Column(String(255), nullable=False)

q = session.query(Product).join(User.addresses)\
    .options(joinedload(Product.orders))\
    .options(joinedload(Product.tags)).all()

Die Leistung dieser Abfrage ist wirklich schlecht, weil dieJOIN vonOrder undTag erzeugt eine riesige Tabelle. Aber dieOrder undTag hat hier keine Beziehung, also sollten sie nicht @ seJOIN. Es sollten zwei getrennte Abfragen sein. Und weil die Sitzung eine gewisse Caching-Ebene aufweist, habe ich meine Abfrage in diese geändert.

session.query(Product).join(Product.order) \
    .options(joinedload(Product.tags)).all()

q = session.query(Product).join(User.addresses) \
    .options(joinedload(Product.cases)).all()

Diesmal ist die Leistung viel besser. Ich bin jedoch nicht davon überzeugt, dass dies der richtige Weg ist. Ich bin mir nicht sicher, ob die Caches der Tags am Ende der Sitzung abgelaufen sind.

Bitte teilen Sie mir den geeigneten Weg für diese Art von Abfrage mit. Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage