【问题标题】:Select into subdict from multiple tables从多个表中选择到 subdict
【发布时间】:2017-02-28 09:22:43
【问题描述】:

我有一个这样的数据库结构:

CREATE TABLE person (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER NOT NULL,
    hometown_id INTEGER REFERENCES town(id)
);

CREATE TABLE town (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    population INTEGER NOT NULL
);

我想在选择时得到以下结果:

{
    "name": "<person.name>",
    "age": "<person.age>"
    "hometown": {
        "name": "<tometown.name>",
        "population": "<tometown.population>"
    }
}

我已经在使用psycopg2.extras.DictCursor,所以我认为我需要使用 SQL 的SELECT AS

这是一个我尝试但没有结果的例子,我做了很多类似的小调整,所有这些都会引发不同的错误:

SELECT
    person(name, age),
    town(name, population) as town,
FROM person
JOIN town ON town.id = person.hometown_id

有什么方法可以做到这一点,还是我应该单独选择所有列并在 Python 中构建字典?

Postgres 版本信息:

psql (9.4.6, server 9.5.2)
WARNING: psql major version 9.4, server major version 9.5.
         Some psql features might not work.

【问题讨论】:

  • postgres 版本?..
  • @VaoTsun 抱歉,已更新。服务器9.5.2,我想这是 Python 唯一关心的事情
  • 我熟悉的 SQL 语法是“SELECT a.name, a.age, b.name, b.population from person a, town b where a.hometown_id = b.id” .此处显示了类似的 postgres 示例:postgresql.org/docs/8.3/static/tutorial-join.html
  • @TomBarron 是的,但这不会将它们输出为嵌套字典
  • @MarkusMeskanen 据我所知,SQL 对 python 字典一无所知

标签: python sql python-3.x postgresql psycopg2


【解决方案1】:

smth like?..

t=# with t as (
select to_json(town),* from town
)
select json_build_object('name',p.name,'age',age,'hometown',to_json) "NameItAsYou Wish"
from person p
join t on t.id=p.hometown_id
;
                                NameItAsYou Wish
--------------------------------------------------------------------------------
 {"name" : "a", "age" : 23, "hometown" : {"id":1,"name":"tn","population":100}}
(1 row)

【讨论】:

  • 天哪,这太棒了,谢谢!我不确定with 如何与select to_json(),* 一起使用,但它可以正常工作。唯一的问题是我得到了这样的 dict 字典:{"json_build_object": {"name": "a", ...}} 而不仅仅是内部字典。我可以很容易地在 Python 中去掉它,所以这很容易,但我想知道是否有一种简单的 SQL 方式?
  • 我添加了别名作为如何将“json_build_object”更改为任何其他键的示例
  • 是的,我已经知道了,但它仍然是一个额外的嵌套字典。但这真的没问题,我会在 Python 中做一个简单的results = [row['json_build_object'] for row in cursor] :) 再次感谢伙计
  • 如何扩展它以支持多个子表?因此,如果我有一个 pet hometown 表,我如何将它们都放入我的 person 结果中?似乎to_json() 总是产生to_json 名称所以我不能在同一个查询中有两个WITH+to_json? ://
  • 在此处添加别名,例如:to_json(town) town_json
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 2011-02-16
  • 2021-11-08
  • 2014-01-12
  • 2011-02-01
  • 2010-10-11
相关资源
最近更新 更多