2012-05-18 7 views
2

Я пишу сценарий оболочки, чтобы запускать кучу запросов в postgres.Как выполнить sql-запросы из сценария оболочки

Это сценарий, который я написал.

#!/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 динамически

Я хочу для создания нового соединения db на итерацию.

Я новичок как в postgre, так и в оболочке.

Благодаря

Priyank

ответ

1

1) pgtest1.sh: 17: Syntax error: end of file unexpected (expecting "done")

Вы должны иметь EOF в своей собственной линии в одиночку (без пробелов и т.д.)

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

2) how do I pass $x in the sql dynamically

$ sh scriptname.sh value_of_x 

затем в сценарии

x=$1 
0

EOF способ, которым вы указали, не может быть отступом. Вам нужно сделать следующее (обратите внимание на дефис до здесь-док маркер:

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 
0

I? сделал то же самое, кроме моего случая, это для mysql. Я использую zsh.Я создал псевдоним, так что оболочка не будет делать какие-либо подстановка, когда я называю сценарий так, что я могу это сделать:

$ 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'" 

В тех случаях, когда я не хочу, сценарий оболочки для автомагически добавить кавычки я опускаю пробелы до и после оператора =, как это:

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

Я вставляю скрипт здесь, если вы можете извлечь из этого выгоду. Это zsh и mysql-specific. Вам придется изменить его, чтобы он соответствовал тому, как вы передаете команды sql для запуска в psql. Программа mpager, используемая в скрипте, представляет собой еще один сценарий оболочки, который вызывает 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 "[email protected]" 
    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 
Смежные вопросы