我有以下脚本,它通过ssh连接到远程服务器并在其Postgresql数据库上发出SQL语句:
#!/bin/bash
db_query() {
app_server="$1"
sql_stmt="$2"
psql_cmd="psql -d vdc --pset tuples_only -c '$sql_stmt'"
rows_count=`ssh $app_server "sudo su - postgres -c \"$psql_cmd\""`
echo "DB_QUERY: rows_count = $rows_count"
}
现在我正在尝试向下表发出SELECT和INSERT语句:
CREATE TABLE pb_properties
(
c_name character varying(255) NOT NULL,
c_value character varying(255),
CONSTRAINT pb_properties_pkey PRIMARY KEY (c_name)
)
如果我执行SELECT语句,此函数可以正常工作:
#!/bin/bash
source db_query.sh
db_query staging "SELECT * FROM pb_properties;"
>> Output: DB_QUERY: rows_count = support-email | test@test.com
但是如果我执行INSERT语句它不起作用:
#!/bin/bash
source db_query.sh
db_query prestaging "INSERT INTO pb_properties (c_name, c_value) VALUES ('support-email', 'test@test.com');"
>> Output:
>>ERROR: column "testname" does not exist
>>LINE 1: ...SERT INTO pb_properties (c_name, c_value) VALUES (testname, ...
^
>>DB_QUERY: rows_count =
现在我如何使用db_query函数成功执行INSERT语句?我已经尝试过多次掩盖我试图插入的值,但是没有一个能够工作。我想这与通过SSH运行sql命令和我正在使用`,'和'。
的不同引号的组合有关。答案 0 :(得分:1)
以下是您可以使用的代码示例,它消除了对tmp文件的依赖:
echo "$sql_stmt" | ssh $app_server "sudo su - postgres -c '/usr/local/pgsql/bin/psql -A -t -U postgres $database'"
答案 1 :(得分:0)
好的,因为我无法在我的问题中使用db_query方法获得单引号的SQL语句,我正在做一个解决方法。在远程服务器上,我将SQL语句重定向到临时文件中。然后我可以让psql读取该文件,然后我就不用再关心引号了。
这是我的新db_query函数:
tmpfile=/tmp/pgquery
db_query() {
app_server="$1"
sql_stmt="$2"
ssh $app_server "echo \"$sql_stmt\" > $tmpfile"
psql_cmd="psql -d vdc --pset tuples_only -f $tmpfile"
rows_count=`ssh $app_server "sudo su - postgres -c \"${psql_cmd}\""`
echo "DB_QUERY: rows_count = $rows_count"
}
现在可以使用我的初始陈述:
db_query prestaging "INSERT INTO pb_properties (c_name, c_value) VALUES ('testname', 'testvalue');"
无论如何,如果有人提示如何在没有临时文件的情况下让它工作,我会很高兴听到它。