【问题标题】:node postgres and getting joined fields with repeated names节点 postgres 并获得具有重复名称的连接字段
【发布时间】:2016-01-06 12:41:40
【问题描述】:

我正在编写一个 node.js 应用程序,它使用 pg 包来访问 PostgreSQL 数据库。我遇到的问题是,如果我执行这样的查询:

select * from posts p inner join blogs b on b.id = p.blog_id

当我得到结果时,它们都在同一个命名空间中,因此 blogs 表中重复的任何字段都会覆盖 posts 表中的字段。

我的问题是,将这些结果绑定到对象的最佳方式是什么?

理想情况下,我想要这样的结果:

{
   id: 1,
   name: 'A post name',
   published_at: (some date object),
   blog_id: 1,
   b: {
       id: 1,
       name: 'A blog name'
   }
}

但我愿意接受任何方便的解决方案,除了手动为每一列添加别名。

【问题讨论】:

  • 数据到对象的映射是由 ORM-s 完成的,而 node-postgres 不是。您必须手动完成。
  • @vitaly-t:我不一定需要它成为一个对象。基本上我只希望所有返回的表都被命名空间,这样我就可以访问所有字段而无需别名。
  • 您找到解决方法了吗?我遇到了同样的问题,但似乎没有任何回应能解决这个问题。 pg 结果包含一个属性 rows 用于合并结果,fields 用于它们是不同的(但它只是列的名称,没有值)。

标签: javascript json node.js postgresql


【解决方案1】:

如果您将查询更改为

'SELECT * FROM posts, blogs WHERE posts.id = blogs.id;'

您的列名应该以“posts”或“blogs”为前缀

如果您想要像上面这样的嵌套结果,则必须运行一些手动处理。

res.map(d => {
   return {
     id: d.posts_id
     b : {
         id: d.blogs_id
     }
   };
});

【讨论】:

  • 在这种情况下为什么要在它们前面加上前缀?这是pg的功能吗?
  • 抱歉 - 我不确定你的桌子是什么样子的。但是如果您从 (table1, table2) 中选择 *,则 table1 中的字段将以 table1_ 为前缀_
  • 是的,但我问你这是否是节点 pg 包的一个特性,还是一般 Postgres 的特性。例如,如果我输入 SELECT posts_id FROM posts, blogs WHERE posts.id = blogs.id 则它不起作用。这是在哪里记录的?
【解决方案2】:

http://www.postgresql.org/docs/9.3/static/functions-json.html http://www.postgresql.org/docs/9.4/static/functions-aggregate.html

您可能想查看 Postgres 的 json 功能。如果我对您的理解是正确的,并且没有测试数据库,这样的东西可能与您正在寻找的内容接近:

SELECT 
    p.*, /* Select all the post fields */
    row_to_json(blogs.*) as b /* Use the row_to_json function on the blogs results */
FROM 
    posts p 
INNER JOIN 
    blogs ON (blogs.id=p.blog_id); /* Join blogs on the proper fields */

返回:

{
    id: 3,
    name: 'test',
    published_at: 2015-10-08,
    blog_id: 2,
    b: {
        id:2,
        name:"test 2"
    }
}

这里有一个很棒的教程: http://bender.io/2013/09/22/returning-hierarchical-data-in-a-single-sql-query/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-12-27
    • 2013-03-20
    相关资源
    最近更新 更多