Jenkins流水线向PostgreSQL插入JSON数据格式错误求助
解决Jenkins流水线向PostgreSQL插入JSON数据的格式问题
问题根源
你遇到的错误是因为shell执行时解析了JSON字符串里的双引号,导致最终传到PostgreSQL的JSON变成了{key: value}(键没有引号),不符合JSON语法规范。
可行的解决方案
1. 用单引号包裹查询语句,避免shell解析内部双引号
修改sh步骤中-c参数的引号为单引号,同时清理查询语句的多余换行:
def insertQuery = """INSERT INTO public.metrics(pr, info) VALUES ('KP-1111', '{"key": "value"}');""" sh """ PGPASSWORD="${dbPassword}" psql -h ${dbHost} -p ${dbPort} -d ${dbName} -U ${dbUser} -c '${insertQuery.trim()}' -w """
trim()去掉查询语句的多余换行和空格,避免psql解析出错- 单引号包裹的内容不会被shell解析,JSON的双引号会完整传递给PostgreSQL
2. 使用psql的Here Document传递查询
这种方式无需处理复杂的引号转义,查询内容会原封不动传给psql,适合复杂SQL或包含特殊字符的场景:
sh """ PGPASSWORD="${dbPassword}" psql -h ${dbHost} -p ${dbPort} -d ${dbName} -U ${dbUser} -w <<EOF INSERT INTO public.metrics(pr, info) VALUES ('KP-1111', '{"key": "value"}'); EOF """
<<EOF和EOF之间的内容会作为输入直接传递给psql,完全保留原始格式
3. 采用参数化查询(更安全,适合动态数据)
通过psql的-v参数传递变量,避免SQL注入同时彻底解决引号问题:
sh """ PGPASSWORD="${dbPassword}" psql -h ${dbHost} -p ${dbPort} -d ${dbName} -U ${dbUser} -w \ -v pr='KP-1111' \ -v info='{"key": "value"}' <<EOF INSERT INTO public.metrics(pr, info) VALUES (:pr, :info::json); EOF """
:pr和:info引用传递的变量,:info::json明确指定类型为JSON- 动态生成数据时,只需修改
-v参数的值即可,无需拼接SQL字符串
内容的提问来源于stack exchange,提问作者Frendom
相关产品推荐
相关产品推荐

