2017-02-28 10 views
1

からsubdictに選択します。私はこのようなデータベース構造を有する複数のテーブル

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 

これを行うにはどのような方法を、または私は選択してください:ここで

はノーresulltと試みたものの一例ですが、私はそれらのすべてが異なるエラーを上げ、微調整と多くの類似を行ってきましたすべての列を個別に作成し、Python内部でdictを構築しますか?

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. 
+0

postgresのバージョン.. –

+0

@VaoTsun申し訳ありませんが、更新しました。サーバー '9.5.2'は、Pythonが気にしている唯一のものだと思います。 –

+0

私が思うSQL構文は、" a.name、a.age、b.name、b.populationを人から選択します。 where a.hometown_id = b.id "となります。同様のpostgresの例がここに表示されます:https://www.postgresql.org/docs/8.3/static/tutorial-join.html –

答えて

2

なめらかような...

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) 
+0

聖なるcrocこれは素晴らしい、感謝です!私は 'with'が' select to_json()、* 'とどのように動作するかは分かりませんが、動作しています。唯一の問題は、内部のdictの代わりに '{" json_build_object ":{" name ":" a "、...}}'のようにdictのdictを得ていることです。私は簡単にPythonでこれを取り除くことができますので、これは簡単には十分ですが、単純なSQLの方法があるのだろうかと思っていました。 –

+0

"json_build_object"を他のキーに変更する方法の例としてエイリアスを追加しました –

+0

ええ、私はすでに考えていましたが、まだ入れ子になっています。しかし、それは実際問題ではありません。私は単純に 'results = [行['json_build_object']をPythonで' 'カーソルの行' 'にします:)もう一度おねえになります –

関連する問題