2011-05-20 64 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'"