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_
我试图遍历一个目录,将所有 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_