gpt4 book ai didi

python - SQLAlchemy - 如何同时从动态加载和预加载中获益

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:30 25 4
gpt4 key购买 nike

我有两个表 Factory 和 Products,每个 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)

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

factory.products.all()  

应该应用。但是由于此时工厂已经加载,因此在工厂和产品之间进行预连接加载性能更高。
但是,由于产品的大量集合,两个表之间的连接关系会使整体性能变差,并且例如在将产品附加到工厂时不需要。 是否可以定义两个表之间的不同关系,但仅在特定情况下使用它们?例如在工厂类的方法中,例如:

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

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

最佳答案

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

您提出的返回关系的建议将不起作用,因为 SQLAlchemy 必须知道属于该表的关系,但是这样做:

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 可能会在您将产品添加到工厂时尝试使用这两种关系,并可能在特定情况下产生重复的条目(例如为关系使用辅助表)。

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

希望对您有所帮助!

关于python - SQLAlchemy - 如何同时从动态加载和预加载中获益,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com