2013-08-14 17 views
19

Mam tabelę w mojej bazie danych PostgreSQL, która ma 3 kolumny - c_uid, c_defaults i c_settings. c_uid po prostu przechowuje nazwę użytkownika, a c_defaults to długi fragment tekstu, który zawiera wiele danych w.r.t tego użytkownika.PostgreSQL - zapytanie ze skryptu bash jako użytkownika bazy danych 'postgres'

Muszę wykonać polecenie ze skryptu bash, który wybiera wartość kolumny c_defaults na podstawie wartości c_uid i musi to zrobić użytkownik bazy danych 'postgres'.

Na CLI mogę wykonać następujące czynności:

[mymachine]# su postgres 
bash-4.1$psql 
postgres=#\c database_name 
You are now connected to database "database_name" as user "postgres". 
database_name=#SELECT c_defaults FROM user_info WHERE c_uid = 'testuser'; 

Jednak, jak mogę to osiągnąć za pomocą skryptu bash?

Celem jest uzyskanie informacji z tej kolumny, edycja i zapisanie jej w tej kolumnie - wszystko za pomocą skryptu bash.

Odpowiedz

55

Spróbuj tego:

#!/bin/bash 
psql -U postgres -d database_name -c "SELECT c_defaults FROM user_info WHERE c_uid = 'testuser'" 

lub używając su:

#!/bin/bash 
su -c "psql -d database_name -c \"SELECT c_defaults FROM user_info WHERE c_uid = 'testuser'\"" postgres 

A także sudo:

#!/bin/bash 
sudo -u postgres -H -- psql -d database_name -c "SELECT c_defaults FROM user_info WHERE c_uid = 'testuser'" 
+0

Skończyłem z wykorzystaniem drugiej opcji, którą podałem i przekazałem do zmiennej. Dziękuję Ci. – rahuL

+0

, więc jego - psql, a nie --psql? – radtek

+1

@radtek Jest z odstępem między. Nazywasz 'psql' za pomocą' sudo', a '--' jest tylko opcjonalnym separatorem. – konsolebox

7

Gdy jesteś zalogowany jako postgres, powinieneś być w stanie napisać:

psql -t -d database_name -c $'SELECT c_defaults FROM user_info WHERE c_uid = \'testuser\';' 

wydrukować tylko wartość tego pola, co oznacza, że ​​można uchwycić go do (na przykład) zapisać w zmiennej bash:

testuser_defaults="$(psql -t -d database_name -c $'SELECT c_defaults FROM user_info WHERE c_uid = \'testuser\';')" 

obsłużyć rejestrowanie się jako postgres, polecam korzystania sudo. Możesz podać konkretnego użytkownika o zezwolenie na prowadzenie

sudo -u postgres /path/to/this/script.sh 

tak, że mogą one działać tylko jeden skrypt jako postgres.

+0

'-bash-4.1 $ psql -t -d nazwa_bazy_danych $ 'SELECT c_defaults Z user_info WHERE c_uid = \' testser \ ';' 'daje mi i błąd - _" psql: FATAL: rola "SELECT c_defaults Z user_info WHERE c_uid = 'Testser';" does not exist_ " – rahuL

+0

@ i.h4d35: Ups, przepraszam, opuściłem flagę' -c' (wprowadzenie zapytania lub polecenia dla 'psql' do uruchomienia). Dodałem go teraz. – ruakh

+0

Kluczem do rozwiązania dla mnie było ucieczkę od tych brzydkich pojedynczych cytatów. Twoje zdrowie. –

7

jeśli planuje uruchomić go z oddzielnego pliku SQL. tutaj jest dobrym przykładem (wzięte z wielkiej stronie, aby dowiedzieć się, jak bash z PostgreSQL http://www.manniwood.com/postgresql_and_bash_stuff/index.html

#!/bin/bash 
set -e 
set -u 
if [ $# != 2 ]; then 
    echo "please enter a db host and a table suffix" 
    exit 1 
fi 

export DBHOST=$1 
export TSUFF=$2 
psql \ 
    -X \ 
    -U user \ 
    -h $DBHOST \ 
    -f /path/to/sql/file.sql \ 
    --echo-all \ 
    --set AUTOCOMMIT=off \ 
    --set ON_ERROR_STOP=on \ 
    --set TSUFF=$TSUFF \ 
    --set QTSTUFF=\'$TSUFF\' \ 
    mydatabase 

    psql_exit_status = $? 

    if [ $psql_exit_status != 0 ]; then 
    echo "psql failed while trying to run this sql script" 1>&2 
    exit $psql_exit_status 
    fi 

    echo "sql script successful" 
exit 0 
7

można podłączyć do psql jak poniżej i pisać zapytań SQL jak zrobić w zwykłej funkcji postgres w bloku. tam, bash zmienne mogą być używane, jednak skrypt powinien być ściśle SQL, nawet na komentarze musisz użyć - zamiast #:.

#!/bin/bash 
psql postgresql://<user>:<password>@<host>/<db> << EOF 
     <your sql queries go here> 
EOF 
1

najbezpieczniejszym sposobem przekazywania poleceń do psql w skrypcie jest przez przeciąganie ciągu znaków lub przekazywanie dokumentu tutaj .doc.

Ten dokument dla opcji -c/--command idzie w bardziej szczegółowy sposób, kiedy należy go unikać.

-c command 
    --command=command 
     Specifies that psql is to execute one command string, command, and then exit. This is useful in shell scripts. Start-up files (psqlrc and ~/.psqlrc) 
     are ignored with this option. 

     command must be either a command string that is completely parsable by the server (i.e., it contains no psql-specific features), or a single 
     backslash command. Thus you cannot mix SQL and psql meta-commands with this option. To achieve that, you could pipe the string into psql, for 
     example: echo '\x \\ SELECT * FROM foo;' | psql. (\\ is the separator meta-command.) 

     If the command string contains multiple SQL commands, they are processed in a single transaction, unless there are explicit BEGIN/COMMIT commands 
     included in the string to divide it into multiple transactions. This is different from the behavior when the same string is fed to psql's standard 
     input. Also, only the result of the last SQL command is returned. 

     Because of these legacy behaviors, putting more than one command in the -c string often has unexpected results. It's better to feed multiple 
     commands to psql's standard input, either using echo as illustrated above, or via a shell here-document, for example: 

      psql <<EOF 
      \x 
      SELECT * FROM foo; 
      EOF 
Powiązane problemy