【问题标题】:How to run a SQL command from a bash variable via ssh and psql?如何通过 ssh 和 psql 从 bash 变量运行 SQL 命令?
【发布时间】:2012-11-13 10:22:02
【问题描述】:

我确实想运行一个 SQL 命令,该命令通过 ssh postgres@hostname psql dbname -c SQL_COMMAND 存储在 bash 变量中。

考虑到 SQL 命令中包含字符串,运行它的正确方法是什么,所以它被正确转义了?

示例:SQL_COMMAND="SELECT 'aaa'"

我正在寻找一种处理转义的解决方案,这样我就可以轻松运行其他 SQL 命令,而不必自己转义它们。

【问题讨论】:

    标签: sql bash ssh escaping psql


    【解决方案1】:

    这在 shell 中是很尴尬的。如果可以选择,我会使用对元字符不太敏感的脚本语言。壳只是痛苦。我知道获得可靠原始字符串的唯一方法是使用(a)像read这样的输入函数; (b) 临时文件;或 (c) 引用此处的文档。

    这就是我要做的,利用ssh 传递标准输入的方式:

    $ ssh hostname psql <<"__END__"
    SELECT 'aaa!*#${notavar}' FROM "generate_series"(1,2);
    __END__
    
         ?column?     
    ------------------
     aaa!*#${notavar}
     aaa!*#${notavar}
    (2 rows)
    

    不幸的是,您不能轻松地将其包装在 $( ... ) 中以将其存储在 shell 变量中。它似乎可以工作,但某些元字符(如 !)会导致问题。

    【讨论】:

      【解决方案2】:

      似乎只为我工作psql -c "$SQLCOMMAND"

      % export SQLCOMMAND='select "generate_series"(1, 5, 1);'
      % echo $SQLCOMMAND
      select "generate_series"(1, 5, 1);
      % psql -c "$SQLCOMMAND"
       generate_series 
      -----------------
                     1
                     2
                     3
                     4
                     5
      (5 rows)
      

      % export SQLCOMMAND="SELECT 'aaa' FROM \"generate_series\"(1,2);"
      % echo $SQLCOMMAND
      SELECT 'aaa' FROM "generate_series"(1,2);
      % psql -c "$SQLCOMMAND"
       ?column? 
      ----------
       aaa
       aaa
      (2 rows)
      

      如果您可以正确地将 SQL 语句放入变量中,则将参数双引号 psql-c 选项似乎可以工作。

      【讨论】:

      • 是的,但是使用“双引号”标识符会分崩离析。
      • SELECT 'aaa' FROM "generate_series"(1,2);
      • 是的,如已编辑...但 OP 似乎想要一种方法来做到这一点不必手动转义 SQL。 “我正在寻找一种可以处理转义的解决方案,这样我就可以轻松运行其他 SQL 命令,而无需自己进行转义。”
      • 我只是转义以将 SQL 语句正确放入环境变量中。一旦到了那里,它就按原样通过了。语义。我会留给 OP 来决定这是否有用。
      • 很公平。然后,您需要加倍转义以将其通过 ssh 传递给 psql -cssh localhost /usr/pgsql-9.2/bin/psql -c "$SQLCOMMAND" 将失败并显示 bash: -c: line 0: syntax error near unexpected token '('。您需要使用类似 bash 的 printf '%q'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 2012-10-23
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多