【问题标题】:how to execute sql queries from a shell script如何从 shell 脚本执行 sql 查询
【发布时间】:2012-05-18 09:10:44
【问题描述】:

我正在编写一个 shell 脚本来在 postgres 中运行一堆查询。

这是我写的脚本。

#!/bin/sh
host="172.16.7.102"
username="priyank"
dbname="truaxis"
x=1
echo "Connection done"
while [ $x -le 3 ]
do
        x=$(($x + 1 ))
        echo "Connection $x"
        psql -h $host $dbname $username << EOF
        select * from students where sid = $x;
        EOF
done

这个脚本有两个问题。

  1. pgtest1.sh: 17: 语法错误:文件结尾意外(预期“完成”)

  2. 如何在sql中动态传递$x

我想在每次迭代时创建新的数据库连接。

我是 postgre 和 shell 的新手。

谢谢

普里扬克

【问题讨论】:

    标签: shell postgresql-9.1


    【解决方案1】:

    1) pgtest1.sh: 17: 语法错误:文件结尾意外(预期“完成”)

    你需要在单独的一行中有 EOF(没有空格等)

         psql -h $host $dbname $username << EOF
            select * from students where sid = $x;
    EOF
    

    2) 如何在sql中动态传递$x

    $ sh scriptname.sh value_of_x
    

    然后在你的脚本中

    x=$1
    

    【讨论】:

      【解决方案2】:

      EOF 您指定的方式不能缩进。您需要执行以下操作(注意破折号 here-doc 标记之前:

      while [ $x -le 3 ] ; do
          psql foo bar <<-EOQ
              select * from students where sid = $x;
          EOQ
      done
      

      附带说明一下,为什么不使用for 循环而不是while

      for (( x=$1 ; x<=3 ; x++ )) ; do
          foo
      done
      

      【讨论】:

        【解决方案3】:

        我做了同样的事情,除了我的情况是 mysql。我正在使用zsh。我设置了一个别名,这样当我调用脚本时,shell 就不会做任何 globbing,这样我就可以这样做了:

        $ sql select * from Table
        

        代替:

        $ sql select '*' from Table
        

        别名是:

        alias sql='noglob sql' 
        

        我还使用sed 在必要时自动添加引号,以便我可以这样做:

        $ sql select * from Client where first_name like John% and last_name = Wiley
        

        代替:

        $ sql select '*' from Client where first_name like "'John%'" and last_name = "'Wiley'"
        

        如果我不希望 shell 脚本自动添加引号,我会省略 = 运算符前后的空格,如下所示:

        $ sql select t1.col1,t2.col2 from Table1 t1 join Table t2 on t1.client_id=t2.client_id.
        

        我将脚本粘贴在这里,以防您从中获利。它是 zsh 和 mysql 特定的。您必须修改它以适应您传递要在 psql 中运行的 sql 命令的方式。脚本中使用的mpager 程序是另一个shell 脚本,它调用vim 并要求它充当适合浏览表格输出的寻呼机:

        #!/usr/bin/zsh
        
        function usage() {
          echo -n "Usage: $0 [-h] [-t] [-d db] [-q] [-v] [-n] [p] [-q] [sql commands]
           -d db   Use specified database instead of the default one
           -t      Do not 'tabularize' (borders) the output
           -v      Be verbose
           -n      Dry-run - show what command to be executed
           -p      Pipe output to mpager
           -q      Surpress own output, only show output from mysql
           -h      Show this help message
        "
        }
        
        password=${DB_PASS:-secret}
        db=${DB:-default_db}
        user=${DB_USER:-username}
        
        USE_TABLE='--table'
        while getopts d:tvnhpq o
        do
          case "$o" in
            d)  db=$OPTARG ;;
            t)  USE_TABLE='' ;;
            v)  verbose=1 ;;
            n)  dry_run='echo' ;;
            p)  use_mpager=t ;;
            h)  usage; exit 0 ;;
            q)  quiet=1;;
            *)  usage;
                exit 1 ;;
          esac
        done
        shift `expr $OPTIND - 1`
        
        case $2 in
            database|databases)
            db=
            ;;
        esac
        if [ -z "$quiet" -a -n "$db" ]; then
            echo 1>&2 "Database: $db"
        fi
        
        if [ $# -lt 1 ]; then
          mysql --table -u $user -p$password $db "$@"
          exit
        fi
        
        to_run=`echo $*|sed -e "s/ \(=\|like\) *\([^'][^ ]*\+\)/ \1 '\2'/g"`
        
        # This helps for debugging. Show what is going to run when output is going to a
        # terminal:
        if [ -t 1 ]; then
            echo "to_run: $to_run" 1>&2
        fi
        
        if [ -n "$verbose" ]; then
            echo "mysql $USE_TABLE -u $user -p$password $db -e ${(q)to_run}"
        fi
        if [ -n "$use_mpager" ]; then
            $dry_run mysql $USE_TABLE -u $user -p$password $db -e "$to_run" | mpager
        else
            $dry_run mysql $USE_TABLE -u $user -p$password $db -e "$to_run"
        fi
        

        【讨论】:

          猜你喜欢
          • 2020-06-24
          • 1970-01-01
          • 2017-01-07
          • 1970-01-01
          • 1970-01-01
          • 2013-01-18
          • 2013-12-17
          • 2016-10-19
          • 1970-01-01
          相关资源
          最近更新 更多