【问题标题】:Multiple SELECTs in Psycopg2 or SQLAlchemyPsycopg2 或 SQLAlchemy 中的多个 SELECT
【发布时间】:2013-11-16 02:47:15
【问题描述】:

我想一次执行多个 SELECT 语句,就像我做的那样

echo "SELECT * FROM x; SELECT * FROM y;" | psql

这样我只向数据库发送一次,并且一次接收所有结果。

用 SQLAlchemy 来做会很完美,但它似乎不受支持(不是吗?)。

我想我可能会重新实现 SQLAlchemy 的某些部分来获得该功能,但我在 psycopg2 中也没有找到解决此问题的方法 - 执行两个用分号分隔的查询只会给出最后一个查询的结果。

那么,是否可以使用 SQLAlchemy(这将是完美的)或使用 psycopg2(这也可以)来做到这一点?

【问题讨论】:

  • 如果这些查询的结果是兼容的,也许UNION 会适用?
  • 为什么要在一次往返而不是两次往返中执行此操作?请注意,当您向psql 发出两条语句时,它确实 进入数据库两次,就像您发出了两次connection.execute() 调用一样。

标签: python sql postgresql sqlalchemy psycopg2


【解决方案1】:

Bartosz - 我遇到了类似的问题,两年前遇到了您的问题。解决此问题的一种方法可能是使用 Postgres json 支持。您可以做的是构建两个选择查询,将行输出转换为 json,将它们合并在一起,然后在 python 或您使用的任何语言中解码。这将在一次往返数据库中获取数据。

您可以使用 postgres 提供的其他 json 构造函数,例如 row_to_jsonhttp://www.postgresql.org/docs/9.3/static/functions-json.html

SELECT to_json((a, b, c))
FROM x

UNION ALL

SELECT to_json((d, e, f, g, h, i))
FROM y

希望有帮助

【讨论】:

    【解决方案2】:

    在您的示例中,运行两个独立的查询。这不是炼金术或 psycopg 的功能。只是纯python:

    query1 = s.query(x).all()
    query2 = s.query(y).all()
    out = query1, query2
    

    【讨论】:

    • 这不是我的问题的解决方案。我知道如何获得两个查询的结果。我的意思是这样做,数据被发送到 Postres 一次并从它接收一次。我在问题里写得很清楚。
    • 在您的示例中,运行两个独立的查询,写在一行中。如果你想在 python 上写成一行,可以这样做: print map(lambda z: s.query(z).all(), [x, y])
    • 这不是关于它需要多少行,而是我的应用程序向数据库服务器发送 SQL 的次数以及它接收结果的次数。我的问题在@IfLoop 的评论中得到了解答——不可能一次完成。
    猜你喜欢
    • 2012-01-25
    • 2021-01-15
    • 2011-11-06
    • 2012-10-18
    • 2016-08-26
    • 2018-10-24
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多