正确使用 Postgres JSON 转换函数
Correct usage of Postgres JSON conversion functions
我正在处理 Postgres 更新事务。
假设我有两个 table:events
和 ticket_books
具有活动预订类型。 ticket_books table 有一个指向 events
.
的外键
我需要更新存储在数据库中的事件,包括来自 ticket_books
table.
的预订类型记录
为了处理级联更新和删除,我决定建立一个事务,在"pseudo-code"中它看起来像:
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;
我目前收到错误:syntax error at or near "json_to_recordset"
。我以前从未使用过 json_to_recordset
或朋友,只是从文档中看到从 9.3 及更高版本开始可用。不过不确定如何让 Postgres 理解我的需要。
我嵌入了一个 JSON 数组,所以最后一行看起来像:
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 数组是有效的。显然,这不是我应该将其传递给 Postgres 的方式。我应该怎么做呢?我的目标是遍历数组条目。如果 booking.id
有一个整数值,我想更新记录,否则插入一条新记录。
您需要查询,独立函数调用通常不算作查询:
FOR booking IN select * from json_to_recordset(...
此外,您不能使用 BEGIN 在 plpgsql 中启动事务。它仅用于启动一个块。如果您使用的是过程而不是函数,那么您可以 COMMIT 但随后会立即开始新的事务而不使用 BEGIN 令牌。
您还缺少 DELETE 和 FOR 之间的分号,但从错误消息来看,似乎只有您的 post 而不是您的实际代码。
我正在处理 Postgres 更新事务。
假设我有两个 table:events
和 ticket_books
具有活动预订类型。 ticket_books table 有一个指向 events
.
我需要更新存储在数据库中的事件,包括来自 ticket_books
table.
为了处理级联更新和删除,我决定建立一个事务,在"pseudo-code"中它看起来像:
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;
我目前收到错误:syntax error at or near "json_to_recordset"
。我以前从未使用过 json_to_recordset
或朋友,只是从文档中看到从 9.3 及更高版本开始可用。不过不确定如何让 Postgres 理解我的需要。
我嵌入了一个 JSON 数组,所以最后一行看起来像:
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 数组是有效的。显然,这不是我应该将其传递给 Postgres 的方式。我应该怎么做呢?我的目标是遍历数组条目。如果 booking.id
有一个整数值,我想更新记录,否则插入一条新记录。
您需要查询,独立函数调用通常不算作查询:
FOR booking IN select * from json_to_recordset(...
此外,您不能使用 BEGIN 在 plpgsql 中启动事务。它仅用于启动一个块。如果您使用的是过程而不是函数,那么您可以 COMMIT 但随后会立即开始新的事务而不使用 BEGIN 令牌。
您还缺少 DELETE 和 FOR 之间的分号,但从错误消息来看,似乎只有您的 post 而不是您的实际代码。