首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将用户名和密码插入数据库时出错

将用户名和密码插入数据库时出错
EN

Stack Overflow用户
提问于 2014-09-26 04:06:47
回答 1查看 395关注 0票数 0

我试图在psql中插入以下数据,它显示了奇怪的错误。

代码语言:javascript
复制
      -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
EN

回答 1

Stack Overflow用户

发布于 2014-09-26 08:58:39

这与PostgreSQL无关。这是一个shell引用问题。

您不能在bash中嵌套单引号。所以这就是:

代码语言:javascript
复制
'insert into ftp_mgr (id, info) values("192.168.1.12",       '{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}');'

请阅读以下内容:

代码语言:javascript
复制
'insert ...'{

并且{不是带引号的字符串的一部分。因此,外壳程序尝试将{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}解释为外壳命令。

这里要做的最简单的事情是使用一个引用在这里的文档,以避免需要处理与外壳的引用混合的'文字引用:

代码语言:javascript
复制
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的字符串连接。只要需要单引号,就结束当前的单引号字符串,编写"'",然后打开一个新的单引号字符串。所以你会写道:

代码语言:javascript
复制
'insert ... values(..., '"'"'{"....

读起来很混乱,不是吗?第一个'结束单引号的外壳字符串。那么"'"就是一个单引号,由shell使用的双引号引用。然后,下一个'开始一个新的单引号字符串。

这读起来很可怕,写起来也不太好:

代码语言:javascript
复制
'insert ... values(..., '\''{"....

因此,就我个人而言,当我需要在参数字符串中使用单引号时,我会用双引号将整个字符串引起来,然后使用反斜杠转义shell元字符:

代码语言:javascript
复制
  "insert into ftp_mgr (id, info) values(\"192.168.1.12\", '{\"username\": \"Administrator\", \"password\": \"abc456\$\", \"serverAddr\":\"192.168.1.12\"}');"

..。或者在可能的情况下,我使用这里引用的文档来绕过整个可怕的混乱。

对于这类事情,我更喜欢避免使用shell,而是使用简单的Python脚本。

代码语言:javascript
复制
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'')、三重引号字符串(""")等的支持使得这类事情变得容易得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26047171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档