【问题标题】:Store multiline EOSQL and with \ char query in variable and run it with psql在变量中存储多行 EOSQL 并使用 \ char 查询并使用 psql 运行它
【发布时间】:2021-11-07 09:19:41
【问题描述】:

我在一个 shell 脚本中有以下代码,它在 docker 容器中初始化 postgres 数据库:

if [ "$ENV" == "development" ];
then
    psql --username "postgres" --dbname "postgres" <<EOSQL

    SELECT 'CREATE DATABASE $DATABASE' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DATABASE');\gexec

    \connect "$DATABASE";

    DO \$\$
    BEGIN
        -- Some stuff
    END
    \$\$;

    -- Other stuff
EOSQL
else
    psql --host "$HOST" --username "postgres" --dbname "postgres" <<EOSQL

    SELECT 'CREATE DATABASE $DATABASE' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DATABASE');\gexec

    \connect "$DATABASE";

    DO \$\$
    BEGIN
        -- Some stuff
    END
    \$\$;

    -- Other stuff
EOSQL
fi

ifelse 语句中,SQL 查询是相同的,我想放入一个变量,这样就不必重复了。

我尝试使用QUERY="...",然后使用psql ... -c "$QUERY",但在\ 字符上出现错误。

有没有办法将此多行 SQL 查询存储在变量中并使用 psql 运行它

【问题讨论】:

    标签: postgresql bash shell psql


    【解决方案1】:

    我总是努力避免这些情况,并尽可能想办法解决它。您可以这样做(并且不更改查询代码中已经有效的任何内容!):

    hostoption=""
    if [[ "$ENV" != "development" ]]
    then
        hostoption="--host $HOST"
    fi
    
    psql $hostoption --username "postgres" --dbname "postgres" <<EOSQL
    
    SELECT 'CREATE DATABASE $DATABASE' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DATABASE');\gexec
    
    \connect "$DATABASE";
    
    DO \$\$
    BEGIN
        -- Some stuff
    END
    \$\$;
    
    -- Other stuff
    EOSQL
    

    这样,hostoption 对于开发来说是空的。在psql 之后添加一个空格不会破坏任何内容。

    对于其他环境,它包含主机选项。

    【讨论】:

      【解决方案2】:

      要轻松测试您的查询,最好将其存储在脚本中并使用psql 中的-f。但是,如果您确实需要在 shell 脚本本身中进行此查询,则可以使用撇号将分隔符 (EOF) 括起来并禁止 shell 扩展,而不是将测试的 sql 脚本复制粘贴到 shell 脚本中,喜欢:

      psql $hostoption --username "postgres" --dbname "postgres" <<'EOSQL'
      
      SELECT 'CREATE DATABASE $DATABASE'  WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DATABASE');\gexec
      
      \connect "$DATABASE";
      
      DO $$
      BEGIN
          -- Some stuff
      END
      $$;
      
      -- Other stuff
      EOSQL
      

      @Nic3500 已经为您的问题指出了更好的编程逻辑。

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2017-08-14
        • 2017-07-13
        • 2022-10-17
        • 2020-10-10
        相关资源
        最近更新 更多