PostgreSQL - query from bash script as database user 'postgres'

后端 未结 8 1074
[愿得一人]
[愿得一人] 2020-12-22 19:22

I have a table in my PostgreSQL database which has 3 columns - c_uid, c_defaults and c_settings. c_uid simply stores the

相关标签:
8条回答
  • 2020-12-22 19:40

    You can connect to psql as below and write your sql queries like you do in a regular postgres function within the block. There, bash variables can be used. However, the script should be strictly sql, even for comments you need to use -- instead of #:

    #!/bin/bash
    psql postgresql://<user>:<password>@<host>/<db> << EOF
           <your sql queries go here>
    EOF
    
    0 讨论(0)
  • 2020-12-22 19:40
    #!/bin/bash
    password='complex=!password'
    PGPASSWORD=$(echo $password) psql -h example.com -U example_user -d example_db -t -c "select * from example_table1" -o example_out.txt 
    
    0 讨论(0)
  • 2020-12-22 19:42

    To ans to @Jason 's question, in my bash script, I've dome something like this (for my purpose):

    dbPass='xxxxxxxx'
    .....
    ## Connect to the DB
    PGPASSWORD=${dbPass} psql -h ${dbHost} -U ${myUsr} -d ${myRdb} -P pager=on --set AUTOCOMMIT=off
    

    The another way of doing it is:

    psql --set AUTOCOMMIT=off --set ON_ERROR_STOP=on -P pager=on \
         postgresql://${myUsr}:${dbPass}@${dbHost}/${myRdb}
    

    but you have to be very careful about the password: I couldn't make a password with a ' and/or a : to work in that way. So gave up in the end.

    -S

    0 讨论(0)
  • 2020-12-22 19:50

    if you are planning to run it from a separate sql file. here is a good example (taken from a great page to learn how to bash with 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
    
    0 讨论(0)
  • 2020-12-22 19:51

    Once you're logged in as postgres, you should be able to write:

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

    to print out just the value of that field, which means that you can capture it to (for example) save in a Bash variable:

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

    To handle the logging in as postgres, I recommend using sudo. You can give a specific user the permission to run

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

    so that they can run just the one script as postgres.

    0 讨论(0)
  • 2020-12-22 19:53

    The safest way to pass commands to psql in a script is by piping a string or passing a here-doc.

    The man docs for the -c/--command option goes into more detail when it should be avoided.

       -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
    
    0 讨论(0)
提交回复
热议问题