Как я могу обновить значения столбца с содержимым файла, не интерпретируя его? - PullRequest
0 голосов
/ 05 ноября 2019

Мне нужно обновить значения в столбце, когда строка соответствует определенному предложению WHERE, используя содержимое текстового файла.

Содержимое файла представляет собой код JavaScript и поэтому может содержать одинарные кавычки. двойные кавычки, косая черта и обратная косая черта - в моем уме могут быть и другие специальные символы. Содержимое файла не может быть изменено. Это должно быть сделано через psql, поскольку обновление автоматизировано с использованием сценариев bash.

С помощью следующей команды - где scriptName - ранее объявленная переменная bash -

psql -U postgres db<<EOF
\set script $(cat $scriptName.js))
UPDATE table SET scriptColumn=:script WHERE nameColumn='$scriptName';
EOF

возвращаетследующая ошибка

ERROR:  syntax error at or near "{"
LINE 1: ...{//...
           ^

Я хотел бы трактовать содержимое файла $scriptName.js как простой текст и избегать его интерпретации.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

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

Короче говоря, установка переменной в качестве параметра psql сделалатрюк:

psql -U postgres db -v script="$(cat $scriptName.js)"<<EOF
UPDATE table SET scriptColumn=:'script' WHERE nameColumn='$scriptName'
EOF

Не знаю, чем это отличается от

psql -U postgres db <<EOF
\set script "$(cat $scriptName.js)"
UPDATE table SET scriptColumn=:'script' WHERE nameColumn='$scriptName'
EOF

, который я пробовал ранее, и возвращает следующую ошибку:

unterminated quoted string
ERROR:  syntax error at or near "//"
LINE 1: // dummy text blahblah

Спасибо всем, кто помог!

0 голосов
/ 05 ноября 2019

Вы должны заключить переменную в кавычки:

UPDATE table SET scriptColumn=:'script' WHERE ...

Это приводит к правильному экранированию содержимого переменной как строкового литерала.

...