Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将用户名和密码插入数据库时出错_Bash_Postgresql_Shell - Fatal编程技术网

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

Bash 将用户名和密码插入数据库时出错,bash,postgresql,shell,Bash,Postgresql,Shell,我试图在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-li

我试图在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

这与PostgreSQL无关。这是一个空壳报价问题

不能在bash中嵌套单引号。因此:

'insert into ftp_mgr (id, info) values("192.168.1.12",       '{"username": "Administrator", "password": "abc456$", "serverAddr":"192.168.1.12"}');'
读至:

'insert ...'{
而且{is*不在引用字符串中,因此shell尝试将{username:Administrator,password:abc456$,serverAddr:192.168.1.12}作为shell命令进行解释

此处最简单的做法是使用此处引用的文档,以避免处理“文字引用”与shell引用的混合:

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__
读起来很混乱,不是吗?第一个“结束单引号shell字符串。然后”是单引号,由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、三引号字符串等的支持使这类事情变得更容易

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"}'
   ))