【问题标题】:Should I use relationship() in SqlAlchemy? [closed]我应该在 SqlAlchemy 中使用 relationship() 吗? [关闭]
【发布时间】:2013-12-17 11:27:55
【问题描述】:

我担心在 SqlAlchemy 中使用 relationship() 时的性能。比如我有2张表:UsersBlogPosts,它们之间的关系是一对多的。如果我使用relationship()user.blogSpots将是BlogPost的列表,所以我假设一个用户(Alex)有100万个BlogSpot,哦,user.blogSpots非常大,因为它包含100万个项目,对吧?如果它是正确的,它必须从数据库中获取 100 万行结果?我认为在现实世界的应用程序中,数据量很大,可能性能会变慢。

那么relationship() 在 SqlAlchemy 中有什么好处呢?使用带有limit 子句的普通“sql 查询”会更好(内存+性能),不是吗?

【问题讨论】:

    标签: mysql database performance memory sqlalchemy


    【解决方案1】:

    relationship 的好处实际上非常简单:列出/添加/删除/更新相关实体。

    但是,您描述的情况是应该以非默认方式处理关系的特殊情况之一。我建议你阅读文档中Collection Configuration and TechniquesWorking with Large Collections 部分。

    适用于您的情况是使用dynamic 关系,它只返回一个预配置的查询,因此您可以根据需要进一步处理它:

    • 应用过滤器
    • 应用限制以仅选择按字段 X 排序的前 N ​​个等

    这样的例子就是一个使用例子:

    class Users(Base):
        blogSpots = relationship("BlogPosts", lazy="dynamic")
    ...
    user1 = session.query(Users).get(1)
    assert user1
    top10byDate = users1.blogSpots.order_by(desc(BlogPosts.POSTED_DATE))[:10]
    taggedTech = users1.blogSpots.filter(BlogPosts.tags.any(Tag.name == 'tech')[:10]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2015-05-27
      • 2018-10-07
      • 2018-09-27
      相关资源
      最近更新 更多