使用 pg-promise 格式化 JSON 输出,将外键封装为对象

Posted

技术标签:

【中文标题】使用 pg-promise 格式化 JSON 输出,将外键封装为对象【英文标题】:Formatting JSON output using pg-promise, encapsulating foreign keys as objects 【发布时间】:2016-12-21 05:32:57 【问题描述】:

我正在使用 Node.JS 和 PostgreSQL 构建一个非常简单的 REST 平台,使用 pg-promise 来访问数据库。我的目标是创建一个非常简单的票务系统,其中包含用户和票证。在这一点上,我只想能够查询服务器以获取所有票证的列表。

我的数据库由以下格式的两个表组成:

CREATE TABLE people (
  ID SERIAL PRIMARY KEY,
  NAME VARCHAR(128)
);

CREATE TABLE tickets (
  ID SERIAL PRIMARY KEY,
  SUBMITTED_BY int4 REFERENCES people(ID),
  TITLE VARCHAR(128)

如您所见,有一个外键指向人员的票证。我已经用以下数据填充了我的数据库:

coop=> SELECT * FROM people;
 id |   name   
----+----------
  1 | John Doe
(1 row)

coop=> SELECT * FROM tickets;
 id | submitted_by |      title       
----+--------------+------------------
  1 |            1 | My first ticket!
(1 row)

我使用 pg-promise 和以下查询函数来呈现 JSON 响应:

// GET ALL query function
function getAllTickets(req, res, next) 
  db.any('select * from tickets left join people on tickets.submitted_by = people.id;')
    .then(function (data) 
      res.status(200)
        .json(
          status: 'success',
          data: data,
          message: 'Retrieved ALL tickets'
        );
    )
    .catch(function (err) 
      return next(err);
    );

该函数有效,我可以检索以下格式的 JSON 输出:

:: GET /api/tickets
    "status":"success","data":["id":1,"submitted_by":1,"title":"My first ticket!","name":"John Doe"],"message":"Retrieved ALL tickets"

但这不是我想要的格式。我想将 'persons' 对象封装在 'tickets' 对象中,替换外键如下:

"status":"success","data":["id":1,submitted_by: "id": 1, "name":"John Doe","title":"My first ticket!"],"message":"Retrieved ALL tickets"

我这样做的原因是我可以轻松地从 Angular2 服务中使用这个 API,并将票证和人员转换为我的组件中的对象。但是我完全不知道该怎么做,而且 pg-promise 文档也没有帮助。

过去一年我一直在使用 Django 进行网络编程,但自从我切换到 Node.JS 后,我感觉自己完全是个新手。有人能帮我一把或指出正确的方向吗?

【问题讨论】:

【参考方案1】:

pg-promise 直接执行查询,并提供与服务器发送的完全相同的数据。它不做任何额外的转换,因为它不是 ORM。

如果您希望您的数据按照您描述的方式进行转换,那就自己动手吧,因为这很简单。

pg-promise 能够以您描述的方式转换数据的唯一方法是,如果查询级别存在分离,即如果存在父查询 + 子查询而不是单个连接查询。有关此类示例,请参阅Get a parents + children tree with pg-promise。

然而,我不建议在这里这样做,因为单个连接查询效率更高。收到数据后,您应该简单地转换数据。

如果您决定采用这种方式,当然有一些 ORM 可以为您做这件事,这将是一种非常不同的方法,与直接查询执行不同。

【讨论】:

vitaly-t,我想你不能给我一个简单的例子来说明如何使用字符串格式来转换结果。这将非常有帮助。 @Fox 最好的例子可以在这里找到:***.com/questions/39805736/…

以上是关于使用 pg-promise 格式化 JSON 输出,将外键封装为对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 pg-promise 的连接池

pg-promise:返回查询结果的正确方法

使用 pg-promise 记录特定的 postgresql 查询

将 pg-promise 任务与 graphql 和 dataloader 一起使用

是否可以使用 pg-promise 和 PostgreSQL(9.5)“创建数据库 ...”?

Next.js API 路由与 pg-promise