PostgreSQL同一条SELECT在psql交互正常命令行执行报错求助
问题原因
- 本质为Shell单引号嵌套解析规则冲突:使用
psql -c执行SQL时,外层用单引号包裹了整段SQL语句,而SQL内部筛选条件里的'db_name'也使用了单引号,Shell解析时会优先将最近的单引号配对,导致原SQL结构被拆分,最终传入PostgreSQL的语句不符合语法要求。 - 结合PostgreSQL标识符规则,被错误解析后的语句中
db_name被识别为标识符(报错可见语句变为datname = "db_name"),而PostgreSQL默认用双引号标记列名、表名等系统标识符,因此数据库会尝试查找名为db_name的列,最终抛出列不存在的错误。
解决方法
可任选以下任意一种方案修正执行命令:
方案1:转义SQL内部的单引号
在Shell单引号包裹的内容中,使用'\''格式转义内部需要使用的单引号:
psql -h <address> -U postgres -d postgres -c 'select * from pg_stat_activity where datname = '\''db_name'\'';'
方案2:外层改用双引号包裹SQL
Shell的双引号范围内可以正常识别单引号,无需额外转义:
psql -h <address> -U postgres -d postgres -c "select * from pg_stat_activity where datname = 'db_name';"
方案3:使用PostgreSQL美元引用语法
对于更复杂的SQL语句,可以使用PostgreSQL支持的美元符号引用写法,完全避免引号冲突问题:
psql -h <address> -U postgres -d postgres -c 'select * from pg_stat_activity where datname = $$db_name$$;'
内容的提问来源于stack exchange,提问作者sync_0
相关产品推荐
相关产品推荐

