将 JSON 数据从 Jenkins 管道插入 Postgresql

问题描述 投票:0回答:2

我正在尝试将 JSON 数据从 Jenkins 管道插入到我的数据库中,不幸的是我在格式正确方面遇到问题。 我的查询看起来像这样:

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}" -w
     """

我遇到的错误:

ERROR:  invalid input syntax for type json
LINE 2: ... INTO public.metrics(pr, info) VALUES ('KP-1111', '{key: val...
                                                             ^
DETAIL:  Token "key" is invalid.
CONTEXT:  JSON data, line 1: {key...

我尝试转义符号,将 JSON 移动到变量中,而不是在查询中进行硬编码。还有其他选项可以插入此数据吗?

postgresql jenkins-pipeline sql-insert
2个回答
0
投票

您的查询的 JSON 数据对于 PostgreSQL 的 JSON 类型来说格式不正确,这就是您看到此错误的原因。 JSON 数据必须具有双引号并用单引号括起来的键,以便 PostgreSQL 接受它。以下是如何更改查询以便成功插入 JSON 数据:

def jsonData = '{"key": "value"}' // Define your JSON data here

def insertQuery = """
                  INSERT INTO public.metrics(pr, info) VALUES ('KP-1111', '${jsonData}'::json);
                  """

sh """
   PGPASSWORD="${dbPassword}" psql -h ${dbHost} -p ${dbPort} -d ${dbName} -U ${dbUser} -c "${insertQuery}" -w

   """

希望有效果


0
投票

您的报价悄悄地不匹配。

query
字符串将其用双引号引起来,然后
sh
再次用双引号引起来,因此您的 -
c "${insertQuery}"
最终评估为:

-c "INSERT INTO public.metrics(pr, info) VALUES ('KP-1111', '{"key": "value"}');"

key
之前的双引号处终止字符串,将其与
key
连接起来,重新打开带引号的字符串并继续直到
value
并执行相同的操作,将其剪切如下:

"INSERT INTO public.metrics(pr, info) VALUES ('KP-1111', '{"
key
": "
value
"}');"

所以你最终会完全失去那些双引号。这就是为什么您可以看到错误消息而没有它们周围

key
value
:

"INSERT INTO public.metrics(pr, info) VALUES ('KP-1111', '{key: value}');"

您可以使用

\
转义引号,以避免它们终止
sh
中的字符串:

def insertQuery = """
                  INSERT INTO public.metrics(pr, info) VALUES ('KP-1111', '{\"key\": \"value\"}');
                  """
© www.soinside.com 2019 - 2024. All rights reserved.