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()は、1つではなく2つのクエリをデータベースに送信しますか?

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 JOIN t_spike_maintenance ON t_robots.robot_id = t_spike_maintenance.robot_id WHEREt_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 robot_id WHEREt_spike_maintenance。"pike_polish_date">?)

sqlalchemyが2つの別々のクエリを実行するのではなく、サブクエリを作成していることがわかります。これは正常なようです。SQLを1回だけ実行しています。

于 2012-08-14T16:27:56.537 に答える