【问题标题】:How to view results as soon as they arrive in psql?如何在结果到达 psql 后立即查看结果?
【发布时间】:2017-11-25 08:41:16
【问题描述】:

当使用 psql 客户端在 Postgres 数据库上执行 SQL 查询时,它会很好地格式化结果并将它们显示在寻呼机中(默认情况下)。如何更改此行为以使 psql 在可用时立即显示结果,而不是等待计算完整的结果集(在更大的计算中)?当然,在这种情况下不能期望对齐输出,因为在打印之前,各个列的宽度是未知的。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    在显示之前不处理完整的结果集意味着psql 中的两个不同的东西:

    1) 对齐模式。要计算任何列的最大宽度以显示对齐的结果,必须在客户端中获取所有行。如果不需要,应该使用\a 命令关闭它:

    \a 在未对齐和对齐输出之间切换 模式

    2)FETCH_COUNT。设置此参数时(例如\set FETCH_COUNT 10000)表示客户端应按块向服务器请求结果,而不是大的单个结果集。它在内部使用游标。记录为:

    FETCH_COUNT 个 如果将此变量设置为 > 0 的整数值,则结果 SELECT 查询被提取并显示在这么多的组中 行,而不是收集整个行的默认行为 显示前的结果集。因此只有有限的数量 无论结果集的大小如何,都会使用内存。 启用此功能时,通常使用 100 到 1000 的设置 特征。请记住,使用此功能时,查询 在已经显示一些行后可能会失败。

    结合 FETCH_COUNT 和未对齐模式将尽快将结果显示到屏幕或文件中。

    此外,在块中获取和对齐模式不能很好地配合使用,正如我们所警告的那样(仍然来自 psql 的手册页):

    小费 尽管您可以通过此功能使用任何输出格式, 默认对齐格式往往看起来很糟糕,因为每个 一组 FETCH_COUNT 行将被单独格式化, 导致跨行组的列宽不同。这 其他输出格式效果更好。

    【讨论】:

    【解决方案2】:

    不幸的是,这在标准 psql 客户端中是不可能的。

    在大多数情况下,您可以使用 LIMIT 和 OFFSET 来限制需要获取的数据量,另请参阅 CURSOR http://www.postgresql.org/docs/9.3/static/plpgsql-cursors.html 你不能在 psql 中使用 CURSOR,抱歉。

    可以创建一个以您想要的方式工作的客户端,这里有一些信息: http://www.postgresql.org/docs/9.3/static/libpq-single-row-mode.html

    更新:以上内容不正确。你可以通过使用 ex 来做到这一点。 \set FETCH_COUNT 10

    见丹尼尔斯的回答

    【讨论】:

    • 你能给游标变体一个完整的例子吗?据我所知,您需要BEGIN; DECLARE foo CURSOR FOR SELECT ...;。可以使用FETCH NEXT FROM foo; 获取单行,但我如何迭代地获取它们全部(或至少批量)?
    • 抱歉,这具有误导性,您不能在 psql 中使用 CURSOR 来满足您的需求。我认为 offset 和 limit 是您最好的选择。或者使用 psql 客户端以外的东西。
    • 游标也存在于更高的 SQL 级别,可以在 psql 或任何 SQL 客户端中使用。见DECLAREFETCH
    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多