SQLAlchemy LazyLoading 的工作原理

Mad*_*ing 4 python sqlalchemy

您好,我想了解 sqlalchemy 延迟加载是如何工作的?假设我有这个查询

results = (
        session.query(Parent).
            options(lazyload(Parent.children)).
            filter(Parent.id == 1).
            all()
    )

    for parent in results:
        logging.error(parent.children)
Run Code Online (Sandbox Code Playgroud)

我想知道如果我在for循环中访问parent.children,这会创建一个新的select语句吗?或者记录或parent.children 是否已缓存或其他什么?我正在考虑这将如何影响性能。我只是想要最优化的方式。

  1. 我应该使用延迟加载吗?
  2. 访问循环中的每个项目将创建一个新的 sqlalchemy
  3. 如何查明 sqlalchemy 是否正在运行查询?(只是想知道访问每个条目是否会创建一个 select 语句

Ilj*_*ilä 8

  1. 或许。
  2. 您的意思是发出新的查询吗?答案是肯定的,这就是重点lazyload()。关系集合属性是在第一次访问时延迟填充的。另一方面,如果您希望避免可能的 N+1 情况,您可以使用例如joinedload()代替来填充同一查询中的子项。
  3. 使用日志记录。传递echo=True您的引擎配置。