代码之家  ›  专栏  ›  技术社区  ›  LittleBobbyTables

psql-f只运行文件中的第一个查询

  •  0
  • LittleBobbyTables  · 技术社区  · 6 年前

    我有文件 make_partition.sql 比如:

    CREATE INDEX my_nice_index ON mytable (ts);
    
    CREATE TABLE mytable_2017_10 AS SELECT * FROM mytable WHERE date_trunc('month', ts) = '2017-10-01';
    CREATE TABLE mytable_2017_11 AS SELECT * FROM mytable WHERE date_trunc('month', ts) = '2017-11-01';
    

    我在后台使用 screen 然后命令:

    psql postgresql://usr:pw@host.com:5432/db_name -f make_partition.sql

    并从屏幕上分离。完成后,似乎只运行了第一个查询。我已经测试过几次了,结果都是一样的。

    我怎样才能让它来运行它们呢?我必须把他们放进这样的程序吗? How to run multiple SQL queries?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Adam Dadvar    6 年前

    当您从屏幕上“分离”时,可能发生的情况是向进程发送一个HUP信号,脚本停止执行,当前正在执行的查询将完成,因为它是另一个进程的一部分。

    您可以通过几种方式将其正确地发送到后台,并使其安全地分离,其中一种方式是使用命令 nohup (见 man nohup 更多)忽略HUP信号。

    另一种方法是按上面的方式启动脚本,然后按暂停 CTRL+Z ,然后可以使用 bg 最后,您可以使用 disown -h (见 man disown 更多信息)。

        2
  •  0
  •   M. Andersen    3 年前

    这个问题相对来说比较老,亚当·达德瓦尔的答案提供了基础知识,但我将提供另一个可能会绊倒某人的谜题。如果文件中的SQL将在每条语句之后创建输出,则需要 redirect at least the stdout into files ,而不是让它去终点站。执行后一种操作意味着它将显示结果,并等待您在运行下一个命令之前用空格键浏览结果。如果您的代码可能会产生您想要忽略的错误,您还应该重定向该输出。具体来说,使用 disown 选项,它看起来像:

    psql postgresql://usr:pw@host.com:5432/db_name -f make_partition.sql 1> messages.log 2> errors.log
    

    然后使用 CTRL+Z 暂停目前的进程, disown -h %1 否认这一过程 bg 为整个过程提供“背景”。