Оператор командной строки Postgres: INSERT жалуется на несуществующий столбец - PullRequest
1 голос
/ 20 мая 2011

У меня есть следующий скрипт, который подключается через ssh к удаленному серверу и выдает оператор SQL в своей базе данных Postgresql:

#!/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 =

Теперь, как я могу сделать успешный оператор INSERT с моей функцией db_query? Я уже пытался замаскировать значения, которые я пытался вставить несколькими способами, но ни одно из них не сработало. Я думаю, это как-то связано с комбинацией запуска команды sql через SSH и разных кавычек, которые я использую `, 'и'.

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Вот пример кода, который вы можете использовать для удаления зависимости от файла tmp:

echo "$sql_stmt" | ssh $app_server "sudo su - postgres -c '/usr/local/pgsql/bin/psql -A -t -U postgres $database'"
0 голосов
/ 20 мая 2011

Хорошо, поскольку я не могу получить оператор 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');"

В любом случае, если у кого-нибудь есть подсказка, как заставить его работать без временного файла, я был бы рад это услышать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...