节点 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中加入两个表后如何为具有相同名称的列提供别名
Postgres连接本地数据库出错-"连线被拒,请检查主机名称和埠号,并确定 postmaster 可以接受 TCP/IP 连线"