REST Api中的原始SQL查询

时间:2014-12-16 19:27:12

标签: sql postgresql relational-database

说我有这两个表:

帖子

 id | user_id | title | slug | content | views
----+---------+-------+------+---------+-------

用户

 id | username | email | hash | role | auth 
----+----------+-------+------+------+------

使用这两个表我想做SELECT * FROM posts ...查询并最终以这样的方式回复:

{[
  {
    "id": "1",
    "user_id": "2",
    "title": "Foo",
    "slug": "foo",
    "content": "bar",
    "views": "0",
    "user": {
      "id": "2",
      "username": "john",
      "email": "john@smith.com",
      "hash": "aeigh*£HAEGhoiaehg",
      "role": "admin",
      "auth": "aeg89hiae9g8hA*H£GA(*EHG"
    }
  }
]}

我对SQL很新,这样的模式在使用ORM时似乎很常见,所以我想知道我必须采取哪些步骤才能使用原始SQL获得这样的结果。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

在postgresql 9.2或更高版本中,您可以使用row_to_json函数:

select row_to_json(posts) 
from 
  posts....;

Read more

您的查询可能如下所示:

select row_to_json(row)
from (
    select p.*, urd AS user
    from posts p
    inner join (
        select ur.*
        from users ur
    ) urd(id,username,email,hash,role,auth) on urd.id = p.user_id 
) row;

这个直接的sql不需要这么复杂:

select
  p.*, u.*
from
  posts p
  inner join users u on p.user_id = u.id

答案 1 :(得分:2)

要获得您要求的内容,请在嵌套子查询中使用row_to_json(),并可选择在外部调用中添加第二个参数TRUE以进行漂亮打印:

SELECT row_to_json(combi, true) AS pretty_json
FROM  (
   SELECT p.*, u AS user
   FROM   posts p
   JOIN   users u ON u.id = p.user_id
   WHERE  p.id = 1
   ) combi;

您只需要一个子查询级别。

关于漂亮格式(仅与文字表示相关) - per documentation:

  

如果pretty_bool为true,则会在第1级元素之间添加换行符。

SQL Fiddle(投射到文本(::text)进行显示;换行符不显示在SQL Fiddle中)。

答案 2 :(得分:0)

或者,您可以使用薄的中间层 - restSQL。它是一个开源的,超轻量级的持久层,对PostgreSQL提供开箱即用的支持。它用9.3测试,但9.2可能不是问题。

您可以使用泊坞窗图片在大约10分钟内部署。