1

如果我使用多个查询对象、代码行或函数来构建最终查询,sqlalchemy 的效率如何?执行每个步骤时是否会影响性能,或者它是否足够聪明,可以弄清楚发生了什么并只执行最终查询?

例如说我有这样做的代码:

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() 是否会向数据库发送两个查询而不是一个?

4

2 回答 2

3

执行每个步骤时是否会影响性能,或者它是否足够聪明,可以弄清楚发生了什么并只执行最终查询?

查询具有明确定义的 SQL 发出点:

  1. 当您对其进行迭代时,即“对于查询中的项目:”

  2. 当你打电话时.all().one().first(), .scalar(), .values(), .count(), 有时.get().

  3. 大多数其他方法就是我们所说的“生成”,也称为“方法链接”。http://docs.sqlalchemy.org/en/latest/orm/query.html中列出的方法应该给出一个提示,如果不是明确的,如果你正在返回一个Query带有额外状态的新的,或者如果你是获取 SQL 发出的结果。

于 2012-08-26T22:05:25.923 回答
1

您可以通过打开 sqlalchemy 回显并运行查询来自行检查。当您连接到数据库时,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 加入 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。

于 2012-08-14T16:27:56.537 回答