执行PostgreSQL查询命令报语法错误的原因与解决方法
问题原因
命令报错的核心是Shell单引号嵌套冲突:
- 你用单引号包裹了
su -c要执行的整条psql命令 - 但SQL语句中
interval '24 hour'、'lastHourAggr'两处直接使用了单引号,Shell解析时会把interval后的第一个单引号识别为外层单引号块的闭合标记,后续所有引号匹配全部错位,最终抛出「找不到匹配双引号」「意外到达文件结尾」的语法错误。
存在问题的原命令如下:
su postgres -c 'psql -d ovirt_engine_history -c " UPDATE history_configuration set var_datetime = var_datetime - interval '24 hour' WHERE var_name = 'lastHourAggr' "'
修正方案
提供两种可直接运行的正确写法,二选一即可:
- 调整引号层级,外层用双引号包裹
su -c的执行内容,内层psql的SQL参数用转义双引号包裹,SQL内部的单引号无需额外处理:su postgres -c "psql -d ovirt_engine_history -c \"UPDATE history_configuration set var_datetime = var_datetime - interval '24 hour' WHERE var_name = 'lastHourAggr'\"" - 保留外层单引号结构,对SQL内部的单引号做Shell转义(单引号块内插入字面单引号的固定写法为
'\''):su postgres -c 'psql -d ovirt_engine_history -c "UPDATE history_configuration set var_datetime = var_datetime - interval '\''24 hour'\'' WHERE var_name = '\''lastHourAggr'\''"'
提示:正式执行UPDATE语句前,可先把SQL替换为SELECT语句做校验,避免误改生产数据。
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

