我有两个表 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/