Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 正确使用Postgres JSON转换函数_Sql_Node.js_Postgresql_Transactions_Plpgsql - Fatal编程技术网

Sql 正确使用Postgres JSON转换函数

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.

我正在处理Postgres更新事务

假设我有两个表:
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之间的分号,但是错误消息中似乎只缺少您的帖子,而实际代码中没有