2011-05-20 33 views
1

我有以下脚本,它通过ssh连接到远程服务器,并发出关于它的SQL语句的PostgreSQL数据库:Postgres的命令行语句:INSERT抱怨非现有列

#!/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 | [email protected] 

但是,如果我做一个INSERT语句不工作:

#!/bin/bash 
source db_query.sh 
db_query prestaging "INSERT INTO pb_properties (c_name, c_value) VALUES ('support-email', '[email protected]');" 

>> Output: 
>>ERROR: column "testname" does not exist 
>>LINE 1: ...SERT INTO pb_properties (c_name, c_value) VALUES (testname, ... 
                  ^
>>DB_QUERY: rows_count = 

现在我该怎么做一个成功的INSERT语句与我db_query功能?我已经尝试掩饰我尝试以多种方式插入的值,但没有一个能够工作。我想这与通过SSH运行sql命令和我使用`,“和'的不同引号的组合有关系。

回答

0

好吧,因为我无法使用带单引号的SQL语句在我的问题中使用db_query方法,我正在做一个解决方法:在远程服务器上,我将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');" 

无论如何,如果任何人有一个提示如何得到它没有临时文件的工作,我会很高兴听到它。

1

下面是一个代码示例,你可以使用一个删除tmp文件的依赖:

echo "$sql_stmt" | ssh $app_server "sudo su - postgres -c '/usr/local/pgsql/bin/psql -A -t -U postgres $database'"