Python SQLAlchemy-如何获取“.count()”查询的原始SQL?
为任何查询获取“原始”SQL的最简单方法就是Python SQLAlchemy-如何获取“.count()”查询的原始SQL?,python,sqlalchemy,Python,Sqlalchemy,为任何查询获取“原始”SQL的最简单方法就是printit(实际上,将其转换为str) 但是,这对count()查询不起作用,因为count()是“触发”方法-一种声明为“这导致执行底层查询”的方法。其他“触发”方法包括all(),first()等 如何获取此类方法的SQL 我对count()特别感兴趣,因为它以某种方式转换底层查询(实际上,这种方式是明确描述的,但情况可能会有所不同)。其他方法也可以更改生成的SQL,例如,first() 因此,有时获取此类查询的原始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()
将现有查询更改为子查询。然后,只需计算其中一个字段。请参见编辑。也就是说。下一次你应该这样做:在你不知道自己到底想做什么的情况下,很难猜出你的每一个意外情况。