2016-08-24 3 views
0

サブセレクションをサポートしていないデータベースでsqlalchemyを使用しています。何それが意味すること(Calendarは宣言ベースを継承したモデルである。)このような何かが動作しないということである。SQLAlchemy - サブセレクトのないデータベースのorm.Query.countをオーバーライド

Calendar.query.filter(uuid=uuid).count() 

私はこのようなものでcountメソッドをオーバーライドしようとしています:

def count(self): 
    col = func.count(literal_column("'uuid'")) 
    return self.from_self(col).scalar() 

しかし、from_selfビットはまだ副選択を行います。私はQueryからすべてのフィルタ情報が欲しいので

session.query(sql.func.count(Calendar.uuid)).scalar() 

:私はこのような何かを行うことはできません。 subselectを実行せずに現在のQueryのフィルタ引数を取得する方法はありますか?

感謝〜SQLAlchemyのドキュメントから

+3

'self.with_entities(col).scalar()'? – univerio

答えて

0

特定の列の上にきめの細かい制御については、FROM句のサブクエリまたはその他のコントロールの使用をスキップし、カウントする、またはその他を使用します集約関数は、クエリ()と組み合わせて使用​​FUNC式、すなわち:

from sqlalchemy import func 

# count User records, without 
# using a subquery. 
session.query(func.count(User.id)) 

# return count of user "id" grouped 
# by "name" 
session.query(func.count(User.id)).\ 
     group_by(User.name) 

from sqlalchemy import distinct 

# count distinct "name" values 
session.query(func.count(distinct(User.name))) 

出典:SQLAlchemy (sqlalchemy.orm.query.Query.count)

+0

フィルタリングについては、 'query = session.query(func.count(Calendar.uuid))。filter(Calendar.uuid == '...')' – Christian

+0

私はスカラーを取得する方法を知っています。 ORMクエリ 'count'をオーバーライドしたいと思います。私の質問に対する最初のコメントは答えです。 – synic

関連する問題