SQLAlchemy - как получить сырой SQL запросов `.count ()`? - PullRequest
0 голосов
/ 11 февраля 2019

Самый простой возможный способ получить «сырой» SQL для любого запроса - просто print его (фактически, преобразовать в str).

Но , это не такработает для count() запросов, потому что count() - это метод "запуска" - метод, который обозначается как "Это приводит к выполнению основного запроса".Другие методы «запуска» включают all(), first() и т. Д.

Как получить SQL для таких методов?

Меня особенно интересует count(), потому что он преобразует лежащие в основезапрос в некотором смысле (на самом деле, этот способ явно описан в документах , но все может отличаться).Другие методы также могут изменять результирующий SQL, например, first().

Так что иногда бывает полезно получить необработанный SQL таких запросов, чтобы выяснить, как все это происходит.

Я читаю ответы о «получении необработанного SQL», но этот случай особенный, потому что такие методы не возвращают Query объекты .

Обратите внимание, что я имею в виду, что мне нужен SQL существующих Query объектов, которые уже построены каким-либо образом.

1 Ответ

0 голосов
/ 11 февраля 2019

Следующий пример вернет счетчик любого объекта запроса, который вы затем сможете преобразовать в строковое представление:

from sqlalchemy import func

...

existing_query = session.query(Something)\
    .join(OtherThing)\
    .filter(OtherThing.foo = 'FOO')\
    .subquery()

query = session.query(func.count(existing_query.c.bar).label('bar_count'))

print(query)

actual_count = query.as_scalar()  # Executes query

Обратите внимание, что вы должны указать поле из вывода запроса длясосчитать.В примере, определенном existing_query.c.bar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...