PostgreSQL - 从bash脚本查询为数据库用户'postgres'

rah*_*huL 42 sql postgresql bash

我在其中有3列我的PostgreSQL数据库中的表- c_uid,c_defaultsc_settings.c_uid只是存储用户的名称,并且c_defaults是一段长文本,其中包含该用户的大量数据.

我必须从bash脚本执行一个语句,该脚本根据值选择c_defaults列的c_uid值,这需要由数据库用户'postgres'完成.

在CLI上,我可以执行以下操作:

[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';
Run Code Online (Sandbox Code Playgroud)

但是,如何通过bash脚本实现此目的?

目的是从该列获取信息,编辑它并将其写回该列 - 所有这些都通过bash脚本完成.

kon*_*box 91

试试这个:

#!/bin/bash
psql -U postgres -d database_name -c "SELECT c_defaults  FROM user_info WHERE c_uid = 'testuser'"
Run Code Online (Sandbox Code Playgroud)

或使用su:

#!/bin/bash
su -c "psql -d database_name -c \"SELECT c_defaults  FROM user_info WHERE c_uid = 'testuser'\"" postgres
Run Code Online (Sandbox Code Playgroud)

而且sudo:

#!/bin/bash
sudo -u postgres -H -- psql -d database_name -c "SELECT c_defaults  FROM user_info WHERE c_uid = 'testuser'"
Run Code Online (Sandbox Code Playgroud)


pic*_*e 涅 24

你可以像下面那样连接到psql,并像在块中的常规postgres函数中一样编写sql查询.在那里,可以使用bash变量.但是,脚本应该是严格的sql,即使是你需要使用的注释 - 而不是#:

#!/bin/bash
psql postgresql://<user>:<password>@<host>/<db> << EOF
       <your sql queries go here>
EOF
Run Code Online (Sandbox Code Playgroud)

  • 我将这个答案和[这种方法](/sf/answers/1067078001/)结合起来得到了完美的解决方案:`psql --command ="SELECT*FROM table;" 的PostgreSQL:// <用户>:<密码> @ <主机>:<端口>/<分贝>` (3认同)

sha*_*sol 14

如果您打算从单独的sql文件运行它.这是一个很好的例子(摘自一个很棒的页面来学习如何使用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
Run Code Online (Sandbox Code Playgroud)


rua*_*akh 8

一旦你登录postgres,你应该能够写:

psql -t -d database_name -c $'SELECT c_defaults FROM user_info WHERE c_uid = \'testuser\';'
Run Code Online (Sandbox Code Playgroud)

只打印出该字段的值,这意味着您可以捕获它(例如)保存在Bash变量中:

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

要处理登录postgres,我建议使用sudo.您可以授予特定用户运行权限

sudo -u postgres /path/to/this/script.sh
Run Code Online (Sandbox Code Playgroud)

这样他们就可以只运行一个脚本了postgres.