如果我使用多个查询对象,代码行或函数来构建我的最终查询,sqlalchemy的效率如何?在执行每一步时是否有性能损失,或者它是否足够聪明以确定发生了什么并且只执行最终查询?
e.g。说我有代码可以做到这一点:
get_shiniest_robots(self, polish_date):
"""Get robot_ids for robots with recently polished spikes."""
return session.query(Robots.robot_id).filter_by(spike_polish_date > polish_date)
然后我有另一个功能
get_dullest_robots(self, polish_date):
"""Get robot_ids for robots that have not been polished lately."""
return session.query(Robots.robot_id).filter_by(~Robots.robot_id.in_(get_shiniest_robots(polish_date))).values(Robots.robot_id)
get_dullest_robots()会向数据库发送两个查询而不是一个查询吗?
答案 0 :(得分:3)
执行每一步是否会影响性能,还是足够聪明地弄清楚发生了什么,只执行最终查询?
Query有明确定义的SQL发出点:
当你迭代它时,就是“对于查询中的项目:”
致电.all()
,.one()
时。 .first()
,.scalar()
,.values()
,.count()
,有时.get()
。
大多数其他方法都是我们所谓的“生成”,也称为“方法链”。 http://docs.sqlalchemy.org/en/latest/orm/query.html中列出的方法应该提供一个提示,如果没有明确说明,如果你回来了一个具有附加状态的新Query
,或者你正在获得SQL发出的结果。
答案 1 :(得分:1)
您可以通过启用sqlalchemy echoing并运行查询来自行检查。当您连接到数据库时,将echo
参数传递给create_engine(dbstring, echo=1)
。
然后运行您的查询。
get_shiniest_robots:
INFO sqlalchemy.engine.base.Engine SELECT t_robots.robot_id AS t_robots_id FROM t_robots JOIN t_spike_maintenance ON t_robots.robot_id = t_spike_maintenance.robot_id WHERE t_spike_maintenance。“spike_polish_date”> ?
get_dullest_robots
INFO sqlalchemy.engine.base.Engine SELECT t_robots.robot_id AS t_robots_id FROM t_robots JOIN t_spike_maintenance ON t_robots.robot_id = t_spike_maintenance.robot_id WHERE t_robots.robot_id NOT IN(SELECT t_robots.robot_id AS t_robots_robot_id FROM t_robots JOIN t_spike_maintenance ON t_robots.robot_id = t_spike_maintenance.robot_id WHERE t_spike_maintenance。“pike_polish_date”> ?)
你可以看到sqlalchemy正在创建一个子查询,而不是执行两个单独的查询,这似乎是正常的。它只执行一次SQL。