如何在不解释文件的情况下使用文件的内容更新列值?

时间:2019-11-05 14:32:19

标签: bash postgresql psql

当行与某个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 :(得分:0)

您应该引用变量:

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

这会使变量的内容正确地作为字符串文字转义。

答案 1 :(得分:0)

即使我不知道它为什么起作用,我也找到了解决问题的方法。 我将其留在此处,希望它可能对其他人有用,或者比我更有知识的人将能够解释为什么它现在有效。

简而言之,将变量设置为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

感谢所有提供帮助的人!