SQLAlchemy стремится загрузить несколько отношений

SQLAlchemy поддерживает энергичную нагрузку для отношений, это в основномJOIN заявление. Однако, если модель имеет два или более отношений, это может быть очень большое соединение. Например,

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()

Производительность этого запроса действительно плохая, потому чтоJOIN изOrder а такжеTag сгенерирует огромную таблицу. НоOrder а такжеTag не имеет никакого отношения здесь, поэтому они не должны бытьJOIN, Это должны быть два отдельных запроса. И поскольку у сеанса есть некоторый уровень кэширования, я изменил свой запрос на этот.

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

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

На этот раз производительность намного лучше. Однако я не уверен, что это правильно. Я не уверен, истечет ли срок действия кешей тегов к концу сессии.

Пожалуйста, дайте мне знать подходящий способ для такого рода запроса. Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос