Sql 正确使用Postgres JSON转换函数
我正在处理Postgres更新事务 假设我有两个表:Sql 正确使用Postgres JSON转换函数,sql,node.js,postgresql,transactions,plpgsql,Sql,Node.js,Postgresql,Transactions,Plpgsql,我正在处理Postgres更新事务 假设我有两个表:events和ticket\u books,其中包含事件预订类型。ticket\u books表有一个外键,指向事件 我需要更新存储在数据库中的事件,包括ticket\u books表中的预订类型记录 为了处理级联更新和删除,我决定在“伪代码”中构建一个事务,它看起来像: BEGIN; DELETE FROM ticket_books WHERE event_id = ${req.
events
和ticket\u books
,其中包含事件预订类型。ticket\u books表有一个外键,指向事件
我需要更新存储在数据库中的事件,包括ticket\u books
表中的预订类型记录
为了处理级联更新和删除,我决定在“伪代码”中构建一个事务,它看起来像:
BEGIN;
DELETE FROM
ticket_books
WHERE
event_id = ${req.params.id} AND
id NOT IN (${bookingIds})
FOR booking IN json_to_recordset('${JSON.stringify(book)}') as book(id int, title varchar(200), price int, ...) LOOP
IF bookind.id THEN
UPDATE
ticket_books
SET
title = booking.title, price = booking.price
WHERE
event_id = ${req.params.id};
ELSE
INSERT INTO
ticket_books (title, price, qty_available, qty_per_sale)
VALUES
(booking.title, booking.price, booking.qty_available, booking.qty_per_sale)
RETURNING
id
END IF;
END LOOP;
UPDATE
event
SET
...
WHERE
id = ...
RETURNING
id;
COMMIT;
FOR booking IN json_to_record('[{"id":13,"description":"Three day access to the festival","title":"Three Day General Admission","price":260,"qty_available":5000,"qty_per_sale":10},{"id":14,"description":"Single day access to the festival","title":"Single Day General Admission","price":"90.90","qty_available":2000,"qty_per_sale":2},{"title":"Free Admission","price":"0.00","qty_available":0,"qty_per_sale":0}]')
我当前收到错误:语法错误位于或接近“json\u to\u记录集”
。我以前从未使用过json\u to\u记录集
或friends,只是从文档中看到了9.3和更高版本的可用性。不过,我不知道如何让博士后理解我的需求
我正在嵌入一个JSON数组,因此最后一行如下所示:
BEGIN;
DELETE FROM
ticket_books
WHERE
event_id = ${req.params.id} AND
id NOT IN (${bookingIds})
FOR booking IN json_to_recordset('${JSON.stringify(book)}') as book(id int, title varchar(200), price int, ...) LOOP
IF bookind.id THEN
UPDATE
ticket_books
SET
title = booking.title, price = booking.price
WHERE
event_id = ${req.params.id};
ELSE
INSERT INTO
ticket_books (title, price, qty_available, qty_per_sale)
VALUES
(booking.title, booking.price, booking.qty_available, booking.qty_per_sale)
RETURNING
id
END IF;
END LOOP;
UPDATE
event
SET
...
WHERE
id = ...
RETURNING
id;
COMMIT;
FOR booking IN json_to_record('[{"id":13,"description":"Three day access to the festival","title":"Three Day General Admission","price":260,"qty_available":5000,"qty_per_sale":10},{"id":14,"description":"Single day access to the festival","title":"Single Day General Admission","price":"90.90","qty_available":2000,"qty_per_sale":2},{"title":"Free Admission","price":"0.00","qty_available":0,"qty_per_sale":0}]')
我相信我的JSON数组是有效的。显然,我不应该这样把它传给博士后。我该怎么做呢?我的目标是迭代数组条目。如果booking.id有一个整数值,我想更新记录,否则插入一个新记录。您需要一个查询,独立函数调用通常不算作查询:
FOR booking IN select * from json_to_recordset(...
此外,您不能在plpgsql中使用BEGIN启动事务。它仅用于启动块。如果您使用的是过程而不是函数,则可以提交,但新事务会立即启动,而不使用BEGIN令牌
您还缺少DELETE和FOR之间的分号,但是错误消息中似乎只缺少您的帖子,而实际代码中没有