我遇到以下错误
错误:json类型的输入语法无效
await this.db.query(
`UPDATE guest_group
SET custom_fields = jsonb_insert(custom_fields, '{0}', '{"value": $3, "display_name": "Traces", "servicio_tags": ["trace"]}'::jsonb, true)
WHERE '{"value": $1}' <@ ANY(
SELECT el
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->'servicio_tags' = '["full-name"]'::jsonb)
AND '{"value": $2}' <@ ANY(
SELECT el
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->'servicio_tags' = '["room-number"]'::jsonb)`,[
trace.guestName,
trace.guestRoomNumber,
trace.value
]);
其中trace
是以下对象:
AppTrace {
value:'test',
guestName: 'Bortolotti, Ingrid',
guestRoomNumber: '422',
}
我不知道我在做什么错。我认为这与插入值有关。感谢您的帮助。
答案 0 :(得分:1)
您缺少JSON字符串周围的引号。这应该起作用:
await this.db.query(
`UPDATE guest_group
SET custom_fields = jsonb_insert(custom_fields, '{0}', '{"value": $3, "display_name": "Traces", "servicio_tags": ["trace"]}'::jsonb, true)
WHERE '{"value": $1}' <@ ANY(
SELECT el
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->'servicio_tags' = '["full-name"]'::jsonb)
AND '{"value": $2}' <@ ANY(
SELECT el
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->'servicio_tags' = '["room-number"]'::jsonb)`,[
JSON.stringify(trace.guestName),
JSON.stringify(trace.guestRoomNumber),
JSON.stringify(trace.value)
]);
但是,我宁愿将整个JSON(B)值传递给查询,并让node-pg进行转义:
await this.db.query(
`UPDATE guest_group
SET custom_fields = jsonb_insert(custom_fields, '{0}', $3::jsonb, true)
WHERE $1 <@ ANY(
SELECT el
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->'servicio_tags' = '["full-name"]'::jsonb)
AND $2 <@ ANY(
SELECT el
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->'servicio_tags' = '["room-number"]'::jsonb)`,[
{"value": trace.guestName },
{"value": trace.guestRoomNumber },
{"value": trace.value, "display_name": "Traces", "servicio_tags": ["trace"]}
]);
或使用the other query:
await this.db.query(
`UPDATE guest_group
SET custom_fields = jsonb_insert(custom_fields, '{0}', $3::jsonb, true)
WHERE EXISTS (
SELECT 1
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->>'value' = $1
AND el->'servicio_tags' = '["full-name"]'::jsonb)
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(custom_fields) AS el
WHERE el->>'value' = $2
AND el->'servicio_tags' = '["room-number"]'::jsonb)
`, [
trace.guestName,
trace.guestRoomNumber,
{"value": trace.value, "display_name": "Traces", "servicio_tags": ["trace"]}
]);