我担心在SqlAlchemy中使用relationship()
时的性能。例如,我有两个表:Users
和BlogPosts
,它们之间的关系是一对多的。如果我使用relationship()
,则user.blogSpots
将是BlogPost
的列表,因此我认为用户(Alex)有100万BlogSpot
,哦,user.blogSpots
是非常大,因为它包含100万件物品,对吧?如果是的话,它必须从数据库中获取100万个结果行?我认为在现实世界的应用程序中,数据量巨大,性能可能会放缓。
那么relationship()
在SqlAlchemy中的好处是什么?使用带有limit
子句的普通“sql查询”更好(内存+性能),不是吗?
答案 0 :(得分:1)
relationship
的好处实际上非常简单:列出/添加/删除/更新相关实体。
然而,您所描述的案例是人们应该以非默认方式处理关系的特殊情况之一。我建议您阅读文档中的Working with Large Collections Collection Configuration and Techniques部分。
适用于您的情况将使用dynamic
关系,该关系仅返回预先配置的查询,因此您可以根据需要进一步处理它:
这样的事情就是一个例子:
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]