python - SQLAlchemy - 如何获取 `.count()` 查询的原始 SQL?

标签 python sqlalchemy

为任何查询获取“原始”SQL 的最简单方法就是打印它(实际上,将它转换为str)。

但是,这不适用于 count() 查询,因为 count() 是“触发”方法 - 声明的方法作为“这导致执行基础查询”。其他“触发”方法包括all()first()等。

如何获取此类方法的SQL?

我对 count() 特别感兴趣,因为它以某种方式转换底层查询(实际上,这种方式已明确描述 in docs ,但情况可能会有所不同)。其他方法也可以改变生成的 SQL,例如 first()

因此,有时获取此类查询的原始 SQL 以调查事情的幕后情况很有用。

我阅读了有关“获取原始 SQL”的答案,但这种情况很特殊,因为此类方法不返回Query 对象

请注意,我的意思是我需要一个 SQL existing Query 对象,这些对象已经以某种方式构建。

最佳答案

以下示例将返回任何查询对象的计数,然后您应该能够将其转换为字符串表示形式:

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 定义的示例中。

关于python - SQLAlchemy - 如何获取 `.count()` 查询的原始 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54633101/

相关文章:

python - 加载大 pickle 时,Flask 应用程序中的 Google App Engine gunicorn 工作超时?

python - 父类 SQLAlchemy 中的 UniqueConstraint

python - SqlAlchemy 更新不适用于 Sqlite

SQL检查是否存在多个

python - 在类的每个方法中捕获相同的异常

Python组合生成

python - Anaconda 加速 check_cuda()

python - 如何避免django中的url增加

Python + SQLAlchemy 问题 : The transaction is inactive due to a rollback in a subtransaction

python - Flask-SQLalchemy 更新一行的信息