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

How can I update column values with the content of a file without interpreting it?

我需要使用文本文件的内容在行与特定 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

returns下面的错误

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

我想将文件 $scriptName.js 的内容视为纯文本,并避免对其进行任何解释。

你应该引用变量:

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

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

我找到了解决我的问题的方法,尽管我不知道它为什么有效。 我把它留在这里是希望它对其他人有用,或者比我更有知识的人能够解释为什么它现在有效。

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

我之前试过 returns 出现以下错误:

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

感谢所有帮助过的人!