Postgres命令行语句:INSERT抱怨不存在的列

时间:2011-05-20 10:21:54

标签: bash postgresql

我有以下脚本,它通过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命令和我正在使用`,'和'。

的不同引号的组合有关。

2 个答案:

答案 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');"

无论如何,如果有人提示如何在没有临时文件的情况下让它工作,我会很高兴听到它。