【问题标题】:SQLAlchemy - how to get raw SQL of `.count()` queries?SQLAlchemy - 如何获取“.count()”查询的原始 SQL?
【发布时间】:2019-02-20 17:37:17
【问题描述】:

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

但是,这不适用于count() 查询,因为count() 是“触发”方法 - 一种方法被声明为“这会导致执行底层查询”。其他的“开火”方式还有all()first()等。

如何获取此类方法的 SQL?

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

因此,有时获取此类查询的原始 SQL 以调查事情的本质是很有用的。

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

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

【问题讨论】:

  • 也许使用func.count() 代替query.count() 可能有效?
  • 您的意思是func.count(query)?如果是这样,那么不,它不起作用。它甚至会产生无法执行的格式错误的 SQL。

标签: python sqlalchemy


【解决方案1】:

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

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

【讨论】:

  • 我已经有了一些查询对象——它有过滤器、连接等。我想得到它的 SQL。这样的Query 对象不等同于sess.query(func.count(Model.id).label('some_count'))
  • @tosh 您可以随时通过调用query.subquery() 将现有查询更改为子查询。然后只需计算其中一个字段即可。见编辑。那就是说。下次你应该关注Stack Overflows MCVE guidelines:如果不确切知道你要做什么,就很难猜出你特定情况下的每一个意外事件。
猜你喜欢
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2015-01-31
  • 2021-10-12
相关资源
最近更新 更多