为任何查询获取“原始”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/