SQLAlchemy - переопределить orm.Query.count для базы данных без подвыбора
Я использую sqlalchemy с базой данных, которая не поддерживает подвыборы. Это означает, что что-то подобное не будет работать (где Calendar
модель, наследующая декларативную базу):
Calendar.query.filter(uuid=uuid).count()
Я пытаюсь переопределить count
метод с чем-то вроде этого:
def count(self):
col = func.count(literal_column("'uuid'"))
return self.from_self(col).scalar()
Тем не менее from_self
немного по-прежнему делает отбор. Я не могу сделать что-то вроде этого:
session.query(sql.func.count(Calendar.uuid)).scalar()
Потому что я хочу всю информацию фильтра из Query
, Есть ли способ получить аргументы фильтра для текущего Query
не делая подвыбор?
Благодаря ~
1 ответ
Из документации по SQLAlchemy:
Для точного контроля над определенными столбцами для подсчета, чтобы пропустить использование подзапроса или иным образом управления предложением FROM или использовать другие агрегатные функции, используйте выражения func вместе с query(), то есть:
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)))