【问题标题】:PostgreSQL background sessionPostgreSQL 后台会话
【发布时间】:2025-12-08 20:30:01
【问题描述】:

我在 Linux 上使用一个古老的库存控制应用程序。它只能打印到文本文件以与其他软件进行通信。当我需要更新我们的 PostgreSQL 数据库中的表时,我一直在使用 psql -f text_file(其中 text_file 是我们的旧应用程序生成的 SQL 命令文件)这工作正常但相当慢,因为 psql 会话在完成每个会话后终止文本文件。我想知道是否有调用 psql 会话作为等待输入并且不终止的后台进程的方法。

【问题讨论】:

    标签: linux shell postgresql


    【解决方案1】:

    如果你想对你的数据库运行一堆 sql 文件,一个接一个,我会启动 psql 作为交互式控制台:

    psql mydatabase
    

    然后用the \i command一个接一个地执行文件:

    \i text_file
    

    如果您想编写脚本/自动化操作,fifo 可能就是您所需要的。我写了more about that here

    或者您可能对像Craig Ringer describes here 这样的协同进程感兴趣。

    【讨论】:

    • 只是好奇,为什么将所有文件一次性发送到psql -f - 更好?
    • @TimPote:如果您想在继续之前检查每个文件的结果,或者如果文件必须按特定顺序执行,或者不是所有文件都可以在同一时间或重复使用相同的文件(内容已更改)。我在介绍中写了“一个接一个”来指代这一点。
    • 嗨 Erwin,非常感谢你 - 它解决了我最初的问题并成为一种教育。
    【解决方案2】:

    我不确定你想要什么。如果您只有一堆需要处理的文件,请使用:

    cat *.sql | psql -f -
    

    如果您只是想持续运行 psql 并让它运行文件中的任何更改,这样的方法可能会起作用:

    (   
    while sleep 5; do
      print "\i sql_file.sql;"
      cat /dev/null > sql_file.sql
    done
    ) | psql --file -
    

    我不确定这是多么可取,我自己从来没有这样做过。

    【讨论】:

    • +1 如果您只想以无特定顺序执行一堆文件并且不想检查其间的结果,cat 路由应该是最简单的解决方案。
    • 感谢 Tim,它允许我在应用程序中生成 SQL 语句,然后通过管道将它们输出到伪打印机 psql -f - 这大大减少了开销。