SQLAlchemy如何在同一时刻从动态和急切的加载中获益

2024-04-26 23:24:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个表Factory和Products,每个工厂可以有大量的产品集合,所以lazy=dynamic已经被应用了。在

class Factory(Base):
    __tablename__ = 'factorys'
    ID = Column(Integer, primary_key=True)
    products = relationship("Product",lazy='dynamic' )

class Product(Base):
    __tablename__ = 'products'
    ID = Column(Integer, primary_key=True)
    factory_id = Column(Integer, ForeignKey('factorys.ID'))
    Name = Column(Text)

如果需要工厂的所有产品:

^{pr2}$

应该应用。但由于此时工厂已经装货,工厂和产品之间的装载更为有效。
但是两个表之间的联接关系会由于产品的大量收集而使整体性能变差,例如在向工厂添加产品时不需要这样做。 是否可以定义两个表之间的不同关系,但只在特定情况下使用它们?例如,在工厂类的方法中,例如:

class Factory(Base):
    __tablename__ = 'factorys'
    ID = Column(Integer, primary_key=True)
    products = relationship("Product",lazy='dynamic' )
    def _getProducts():
        return relationship("Product",lazy='joined' )

我怎样才能以高性能的方式获得一个工厂的所有产品,而不是在向工厂添加产品时失去性能? 如有任何提示,我们将不胜感激。在


Tags: keyidbase产品factory工厂columndynamic
1条回答
网友
1楼 · 发布于 2024-04-26 23:24:06

我遇到了同样的问题,很难找到答案。在

你一定不知道和阿尔切米的关系是什么,但你必须知道这是什么关系:

class Factory(Base):
__tablename__ = 'factorys'
ID = Column(Integer, primary_key=True)
products_dyn = relationship("Product",lazy='dynamic', viewonly=True)
products = relationship("Product",lazy='joined' )

应该行得通。请注意viewonly属性,这一点非常重要,因为没有它,SQLAlchemy可能会在向工厂添加产品时尝试使用这两种关系,并且在特定情况下可能会产生重复的条目(例如为关系使用辅助表)。在

通过这种方式,您可以同时使用预先加载的产品,并对联接执行优化查询,同时用表声明隐藏它。在

希望有帮助!在

相关问题 更多 >