远程PSQL执行含大小写敏感对象的SQL语句失败求助
解决PostgreSQL远程执行SQL时大小写敏感表/列名的问题
问题核心是shell会解析你外层双引号内的双引号,导致PostgreSQL实际收到的SQL里没有正确包裹表名和列名的双引号,自然无法识别大小写敏感的对象。
正确写法一:转义双引号
在shell的双引号字符串内,用反斜杠\转义SQL里的双引号,这样shell会把这些双引号完整传递给psql:
PGPASSWORD=$secret psql -h $dbip -p $port -d $db -U $dbuser -c "UPDATE \"AO_4AEACD_WEBHOOK_DAO\" set \"URL\" = 'https://testy.com' WHERE \"URL\" ='https://test.com';"
正确写法二:用单引号包裹SQL内容
如果不想用反斜杠转义,可以用单引号把整个SQL语句包起来,同时把SQL里的单引号替换成两个连续单引号(PostgreSQL识别这种写法为单个单引号):
PGPASSWORD=$secret psql -h $dbip -p $port -d $db -U $dbuser -c 'UPDATE "AO_4AEACD_WEBHOOK_DAO" set "URL" = ''https://testy.com'' WHERE "URL" =''https://test.com'';'
注意:这种写法下,shell不会解析单引号内的变量,所以如果你的SQL里需要引用shell变量,得把变量部分放在单引号外面拼接。
之前写法失败的原因
- 第一种失败写法:
"UPDATE "AO_4AEACD_WEBHOOK_DAO"..."
shell会把第一个"视为字符串开始,第二个"视为字符串结束,AO_4AEACD_WEBHOOK_DAO会被当成独立的命令参数,直接导致shell语法错误。 - 第二种失败写法:
UPDATE '"AO_4AEACD_WEBHOOK_DAO"'
传递给PostgreSQL的SQL里,表名被单引号包裹了,PostgreSQL会把它当成字符串常量,而非表名,自然找不到对应的表。
内容的提问来源于stack exchange,提问作者Chris Surman
相关产品推荐
相关产品推荐

