如何解决Psql 在连接到数据库时找到路径,但在使用 -c
我正在尝试遍历一个目录,将所有 json 文件复制到我的 PostgreSQL 数据库中。当我复制它们时,我必须用 \\ 替换任何 \ 以便 Postgres 可以正确解析它。
当我跑步时:
$ psql -p 30001 my_database
my_database=#\copy my_jsons from program 'sed ''s/\\/\\\\/g'' < /home/postgres/jsons.json';
这个命令工作正常并且正确地将数据插入到表中。但是,由于我需要复制多个文件,因此我尝试遍历目录并使用以下方法插入:
$ 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_
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。