节点postgres和重复连接字段名称
我正在编写一个使用pg包访问PostgreSQL数据库的node.js应用程序。 我遇到的问题是,如果我做这样的查询:
select * from posts p inner join blogs b on b.id = p.blog_id
当我得到结果时,它们都在同一个命名空间中,所以博客表中重复的任何字段都将覆盖posts表中的那些字段。
我的问题是,将这些结果绑定到对象的最好方法是什么?
理想情况下,我想要一个像这样的结果:
{ id: 1, name: 'A post name', published_at: (some date object), blog_id: 1, b: { id: 1, name: 'A blog name' } }
但我打开任何方便的解决scheme,手动添加每个列的别名。
http://www.postgresql.org/docs/9.3/static/functions-json.html http://www.postgresql.org/docs/9.4/static/functions-aggregate.html
你可能想看看Postgres的json特性。 如果我正确地理解了你,没有一个testing数据库这样的东西可能接近你正在寻找的东西:
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/
如果你改变你的查询
'SELECT * FROM posts, blogs WHERE posts.id = blogs.id;'
你应该有你的列名前缀'职位'或'博客'
如果你想要一个如上所述的嵌套结果,你将不得不运行一些手动处理。
res.map(d => { return { id: d.posts_id b : { id: d.blogs_id } }; });