python - SQLAlchemy LazyLoading 的工作原理

标签 python sqlalchemy

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

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

    for parent in results:
        logging.error(parent.children)

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

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

最佳答案

  1. 也许吧。
  2. 您的意思是发出新查询吗?答案是yes ,这就是 lazyload() 的要点。关系集合属性是在第一次访问时延迟填充的。另一方面,如果您希望避免可能的 N+1 情况,您可以使用 joinedload()相反,为了在同一查询中填充子项。
  3. 使用logging 。在您的引擎配置中传递 echo=True

关于python - SQLAlchemy LazyLoading 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47241641/

相关文章:

python - NLTK 中是否有任何用于文本规范化和规范化的类?

python - 如何使用 numpy 有效地制作脉冲噪声图像?

python - 尝试在此单行循环中增加 Y

python - SQLAlchemy:如何从多个表中选择最大值

python-3.x - 有没有办法在 pandas read_sql 函数中设置超时?

join - Flask-SQLAlchemy 中的跨数据库连接

python - Django 可插拔动态导航应用程序

Mac 上的 Python 3 : ModuleNotFoundError: No module named 'mglearn'

python - SQLAlchemy "too many clients already"错误

python - 有什么理由不使用 SQLObject 而不是 SQLAlchemy?