节点 postgres 并获得具有重复名称的连接字段

Posted

技术标签:

【中文标题】节点 postgres 并获得具有重复名称的连接字段【英文标题】:node postgres and getting joined fields with repeated names 【发布时间】: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 用于它们是不同的(但它只是列的名称,没有值)。 【参考方案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/

【讨论】:

以上是关于节点 postgres 并获得具有重复名称的连接字段的主要内容,如果未能解决你的问题,请参考以下文章

php函数以获取数据,将具有通用字段名称的多个表连接起来并显示输出[重复]

Hibernate - JPA 在不同的情况下生成具有相同名称的重复表

在 Windows 中,停止 postgres 服务会导致节点崩溃并显示“错误:由于管理员命令而终止连接”

在Postgres中加入两个表后如何为具有相同名称的列提供别名

如何连接具有选择性重复记录的表? (oracle10g)

Postgres连接本地数据库出错-"连线被拒,请检查主机名称和埠号,并确定 postmaster 可以接受 TCP/IP 连线"