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

标签 python sql sqlalchemy

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

相关文章:

mysql - 无法弄清楚如何在 MySQL 中生成子采样 View

SQL 查询语法 : Using table alias in a count is invalid? 为什么?

python - 如何使用sqlsoup插入字典

python - Python 3 的 Elixir ?

python - sqlalchemy,如果它不存在则创建一个 sqlite 数据库

python - 从 Scikits-Image 初始化 RAG 图的方法

python - 如何在表单中放置带有下拉列表的字段名称而不是其引用 ID?

python - 在 Python 中向数据框列添加百分号

python - 无损 PDF 旋转

java - 使用容器进行 SQL 字符串查询