Python SQLAlchemy-如何获取“.count()”查询的原始SQL?

Python SQLAlchemy-如何获取“.count()”查询的原始SQL?,python,sqlalchemy,Python,Sqlalchemy,为任何查询获取“原始”SQL的最简单方法就是printit(实际上,将其转换为str) 但是,这对count()查询不起作用,因为count()是“触发”方法-一种声明为“这导致执行底层查询”的方法。其他“触发”方法包括all(),first()等 如何获取此类方法的SQL 我对count()特别感兴趣,因为它以某种方式转换底层查询(实际上,这种方式是明确描述的,但情况可能会有所不同)。其他方法也可以更改生成的SQL,例如,first() 因此,有时获取此类查询的原始SQL是有用的,以便调查事情

为任何查询获取“原始”SQL的最简单方法就是
print
it(实际上,将其转换为
str

但是,这对
count()
查询不起作用,因为
count()
是“触发”方法-一种声明为“这导致执行底层查询”的方法。其他“触发”方法包括
all()
first()

如何获取此类方法的SQL

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

因此,有时获取此类查询的原始SQL是有用的,以便调查事情是如何进行的

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


请注意,我的意思是,我需要一个现有
查询
对象的SQL,这些对象已经以某种方式构造。

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

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\u query.c.bar

定义的示例中,可能使用
func.count()
代替
query.count()
?您的意思是
func.count(query)
?如果是这样的话,那就不行了。它甚至产生了无法执行的错误SQL。我已经有了一些查询对象-它有过滤器、连接等。我想得到它的SQL。这样的
Query
对象并不等同于
sess.Query(func.count(Model.id).label('some_count'))
@tosh您可以随时通过调用
Query.subquery()
将现有查询更改为子查询。然后,只需计算其中一个字段。请参见编辑。也就是说。下一次你应该这样做:在你不知道自己到底想做什么的情况下,很难猜出你的每一个意外情况。