PostgreSQL 9.2 row_to_json() avec imbriqué rejoint

Je suis en train de cartographier les résultats d'une requête JSON à l'aide de la row_to_json() fonction qui a été ajoutée dans PostgreSQL 9.2.

Je vais avoir de la difficulté à déterminer la meilleure manière de représenter des lignes jointes comme des objets imbriqués (1:1 relations)

Voici ce que j'ai essayé (code d'installation: les tableaux, les données de l'échantillon, suivie par la requête):

-- some test tables to start out with:
create table role_duties (
    id serial primary key,
    name varchar
);

create table user_roles (
    id serial primary key,
    name varchar,
    description varchar,
    duty_id int, foreign key (duty_id) references role_duties(id)
);

create table users (
    id serial primary key,
    name varchar,
    email varchar,
    user_role_id int, foreign key (user_role_id) references user_roles(id)
);

DO $$
DECLARE duty_id int;
DECLARE role_id int;
begin
insert into role_duties (name) values ('Script Execution') returning id into duty_id;
insert into user_roles (name, description, duty_id) values ('admin', 'Administrative duties in the system', duty_id) returning id into role_id;
insert into users (name, email, user_role_id) values ('Dan', '[email protected]', role_id);
END$$;

La requête elle-même:

select row_to_json(row)
from (
    select u.*, ROW(ur.*::user_roles, ROW(d.*::role_duties)) as user_role 
    from users u
    inner join user_roles ur on ur.id = u.user_role_id
    inner join role_duties d on d.id = ur.duty_id
) row;

J'ai découvert que si j'ai utilisé ROW(), je pourrais séparer les champs qui en résultent dans un objet enfant, mais il semble limitée à un seul niveau. Je ne peux pas insérer plus de AS XXX déclarations, je pense que j'en aurais besoin dans ce cas.

Je suis offerte les noms de colonne, parce que je l'ai jeté à la appropriée de type d'enregistrement, par exemple avec ::user_roles, dans le cas de la table de résultats.

Voici ce que la requête retourne:

{
   "id":1,
   "name":"Dan",
   "email":"[email protected]",
   "user_role_id":1,
   "user_role":{
      "f1":{
         "id":1,
         "name":"admin",
         "description":"Administrative duties in the system",
         "duty_id":1
      },
      "f2":{
         "f1":{
            "id":1,
            "name":"Script Execution"
         }
      }
   }
}

Ce que je veux faire est de générer du JSON pour les jointures (encore 1:1 est très bien) dans une voie où je peux ajouter des jointures, et les ont représentés comme des objets enfants de parents ils rejoignent, c'est à dire comme ce qui suit:

{
   "id":1,
   "name":"Dan",
   "email":"[email protected]",
   "user_role_id":1,
   "user_role":{
         "id":1,
         "name":"admin",
         "description":"Administrative duties in the system",
         "duty_id":1
         "duty":{
            "id":1,
            "name":"Script Execution"
         }
      }
   }
}

Toute aide est appréciée. Merci pour la lecture.

  • C'est là, dans le code d'installation. Les inserts. Je suis allé à la peine de mettre tout en place afin que toute personne pourrait répliquer à ma situation.
InformationsquelleAutor dwerner | 2012-11-05