Psql 在连接到数据库时找到路径,但在使用 -c 的 运行 命令时找不到路径

Psql finds path when connected to the database but not when running command with -c

我试图遍历一个目录,将所有 json 文件复制到我的 PostgreSQL 数据库中。当我复制它们时,我必须用 \\ 替换任何 \ 以便 Postgres 可以正确解析它。

当我运行:

$ psql -p 30001 my_database
my_database=#\copy my_jsons from program 'sed ''s/\/\\/g'' < /home/postgres/jsons.json';

此命令工作正常,并将数据正确插入 table。但是,由于我有多个文件需要复制,因此我试图遍历一个目录并使用以下方式插入:

$ psql -p 30001 my_database -c "\copy my_jsons from program 'sed ''s/\/\\/g'' < /home/postgres/jsons.json';"

使用这个命令,sed 开始表现不同,我得到错误:

sed: -e expression #1, char 8: unterminated `s' command

有谁知道为什么 sed 在以这种方式使用它时表现不同,我可以做些什么来获得我想要的结果?

您的转义 \ 由 shell 解释。这会产生以下 PostgreSQL 命令:

\copy my_jsons from program 'sed ''s/\/\/g'' < /home/postgres/jsons.json';

您可以看到 sed 命令已更改为不再有效的方式,因此出现错误消息。

解决方案 1

两次逃脱:

$ psql -p 30001 my_database -c "\copy my_jsons from program 'sed ''s/\\/\\\\/g'' < /home/postgres/jsons.json';"

这很丑陋,难以阅读和维护。

解决方案 2

不要使用 psql-c 选项并通过标准输入(Bash 的此处-此处的文档)发出命令:

psql -p 30001 my_database <<- "_END_"
    \copy my_jsons from program 'sed ''s/\/\\/g'' < /home/postgres/jsons.json';
_END_