1. ホーム
  2. python

[解決済み] SQLAlchemyでSELECT COUNT(*)で行数を数えるには?

2023-05-22 18:38:42

質問

を生成することが可能かどうか知りたいのですが。 SELECT COUNT(*) FROM TABLE ステートメントを生成することができるのか知りたいです。 execute() . を使ったら

session.query(table).count()

とすると、次のようなものが生成されます。

SELECT count(*) AS count_1 FROM
    (SELECT table.col1 as col1, table.col2 as col2, ... from table)

を使用すると、InnoDBを使用したMySQLでは著しく遅くなります。で提案されているように、テーブルが既知の主キーを持つことを必要としない解決策を探しています。 SQLAlchemy を使ってテーブルの行数を取得する .

どのように解決するのですか?

以下のSELECTをSQLAlchemyで両レイヤーにレンダリングすることができました。

SELECT count(*) AS count_1
FROM "table"

SQL Expressionレイヤーからの使用法

from sqlalchemy import select, func, Integer, Table, Column, MetaData

metadata = MetaData()

table = Table("table", metadata,
              Column('primary_key', Integer),
              Column('other_column', Integer)  # just to illustrate
             )   

print select([func.count()]).select_from(table)

ORM層からの利用

単にサブクラス Query をサブクラス化し (どうせそうでしょう)、特殊な count() メソッドを提供します。

from sqlalchemy.sql.expression import func

class BaseQuery(Query):
    def count_star(self):
        count_query = (self.statement.with_only_columns([func.count()])
                       .order_by(None))
        return self.session.execute(count_query).scalar()

以下の点に注意してください。 order_by(None) はクエリの順序をリセットしますが、これはカウントには関係ありません。

このメソッドを使用すると count(*) を指定すると、ORM クエリのすべての filterjoin の条件が既に指定されています。