【问题标题】:Run PSQL queries stored as strings in bash [duplicate]在bash中运行存储为字符串的PSQL查询[重复]
【发布时间】:2021-03-08 11:48:47
【问题描述】:

我正在尝试编写一个在 PostgreSQL 中运行查询的脚本。我正在为看起来很简单的事情苦苦挣扎(但不起作用......)。

  • 我有一组存储为字符串数组的查询,比如说
query1="SELECT COUNT(id) FROM nodes WHERE label='KeywordList';"
query2="SELECT COUNT(id) FROM nodes WHERE label='AuthorList';"
queries=($query1 $query2)
  • 然后,我想通过循环在 PSQL 中运行这个查询:
for query in "${queries[@]}" 
do
    psql $db_name -c "$query"
done

这给了我以下错误:

ERROR:  syntax error at or near "COUNT"
LINE 1: COUNT(id)
        ^
ERROR:  syntax error at or near "FROM"
LINE 1: FROM
        ^
ERROR:  syntax error at or near "nodes"
LINE 1: nodes
        ^
ERROR:  syntax error at or near "WHERE"
LINE 1: WHERE
        ^
ERROR:  syntax error at or near "label"
LINE 1: label='KeywordList';
  • 但是,当我将字符串本身提供给 PSQL 时,这会起作用:psql $db_name -c "$query1"(这会返回给我 10)。

我认为这是一个引用问题,或者 Bash 试图理解字符串中的内容...在多次尝试使用双引号、单引号和反引号后,我无法自己解决这个问题。

非常感谢您的帮助,Nelly。

【问题讨论】:

    标签: bash shell psql quotes


    【解决方案1】:

    原样:

    $ query1="SELECT COUNT(id) FROM nodes WHERE label='KeywordList';"
    $ query2="SELECT COUNT(id) FROM nodes WHERE label='AuthorList';"
    $ queries=($query1 $query2)
    $ typeset -p queries
    declare -a queries=([0]="SELECT" [1]="COUNT(id)" [2]="FROM" [3]="nodes" [4]="WHERE" [5]="label='KeywordList';" [6]="SELECT" [7]="COUNT(id)" [8]="FROM" [9]="nodes" [10]="WHERE" [11]="label='AuthorList';")
    

    请注意,查询已被分解为单独的标记并存储为单独的数组条目。

    与您的 psql 示例一样,您需要在引用查询变量时引用它们......以在填充数组时包含,例如:

    $ queries=("$query1" "$query2")
    $ typeset -p queries
    declare -a queries=([0]="SELECT COUNT(id) FROM nodes WHERE label='KeywordList';" [1]="SELECT COUNT(id) FROM nodes WHERE label='AuthorList';")
    

    【讨论】:

    • 很高兴我能帮上忙; typeset -p <variable> 是一个 BIG 帮助,可以帮助您了解变量(尤其是数组)中究竟存储了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多