我试图在psql中插入以下数据,它显示了奇怪的错误。
-bash-4.1$ psql -t -d mydb -c 'insert into ftp_mgr (id, info) values("192.168.1.12", '{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}');'
psql: warning: extra command-line argument "password:" ignored
psql: warning: extra command-line argument "abc456$," ignored
psql: warning: extra command-line argument "serverAddr:192.168.1.12});" ignored
psql: FATAL: role "Administrator," does not exist发布于 2014-09-26 08:58:39
这与PostgreSQL无关。这是一个shell引用问题。
您不能在bash中嵌套单引号。所以这就是:
'insert into ftp_mgr (id, info) values("192.168.1.12", '{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}');'请阅读以下内容:
'insert ...'{并且{不是带引号的字符串的一部分。因此,外壳程序尝试将{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}解释为外壳命令。
这里要做的最简单的事情是使用一个引用在这里的文档,以避免需要处理与外壳的引用混合的'文字引用:
psql -t -d mydb <<'__END__'
insert into ftp_mgr (id, info) values
("192.168.1.12", '{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}');
__END__here-document标记周围的引号很重要。如果省略了它们,bash仍然会在here-document文本中查找并替换$variable字符串等。这可能真的很方便,但它显然不是您在这种情况下想要的。
如果您必须使用-c执行此操作,您有两个选择:
使用shell的字符串连接。只要需要单引号,就结束当前的单引号字符串,编写"'",然后打开一个新的单引号字符串。所以你会写道:
'insert ... values(..., '"'"'{"....读起来很混乱,不是吗?第一个'结束单引号的外壳字符串。那么"'"就是一个单引号,由shell使用的双引号引用。然后,下一个'开始一个新的单引号字符串。
这读起来很可怕,写起来也不太好:
'insert ... values(..., '\''{"....因此,就我个人而言,当我需要在参数字符串中使用单引号时,我会用双引号将整个字符串引起来,然后使用反斜杠转义shell元字符:
"insert into ftp_mgr (id, info) values(\"192.168.1.12\", '{\"username\": \"Administrator\", \"password\": \"abc456\$\", \"serverAddr\":\"192.168.1.12\"}');"..。或者在可能的情况下,我使用这里引用的文档来绕过整个可怕的混乱。
对于这类事情,我更喜欢避免使用shell,而是使用简单的Python脚本。
import psycopg2
conn = psycopg2.connect('dbname=postgres')
curs = conn.cursor()
curs.execute(r'insert into ftp_mgr (id, info) values(%s, %s);', (
r'192.168.1.12',
r'{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}'
))Python对原始字符串(r'')、三重引号字符串(""")等的支持使得这类事情变得容易得多。
https://stackoverflow.com/questions/26047171
复制相似问题