Ich versuche, die Ergebnisse einer Abfrage mithilfe der row_to_json()
in PostgreSQL 9.2 hinzugefügten Funktion JSON zuzuordnen .
Ich habe Probleme, herauszufinden, wie verbundene Zeilen am besten als verschachtelte Objekte dargestellt werden können (1: 1-Beziehungen).
Folgendes habe ich versucht (Setup-Code: Tabellen, Beispieldaten, gefolgt von einer Abfrage):
-- 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', 'someemail@gmail.com', role_id);
END$$;
Die Abfrage selbst:
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;
Ich habe festgestellt, dass ich bei Verwendung ROW()
die resultierenden Felder in ein untergeordnetes Objekt aufteilen könnte, aber es scheint auf eine einzelne Ebene beschränkt zu sein. Ich kann keine weiteren AS XXX
Anweisungen einfügen , da ich denke, dass ich sie in diesem Fall benötigen sollte.
Ich erhalte Spaltennamen, weil ich in den entsprechenden Datensatztyp umgewandelt habe, z. B. mit ::user_roles
im Fall der Ergebnisse dieser Tabelle.
Diese Abfrage gibt Folgendes zurück:
{
"id":1,
"name":"Dan",
"email":"someemail@gmail.com",
"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"
}
}
}
}
Was ich tun möchte, ist JSON für Joins zu generieren (wieder 1: 1 ist in Ordnung), so dass ich Joins hinzufügen und sie als untergeordnete Objekte der Eltern darstellen lassen kann, denen sie beitreten, dh wie folgt:
{
"id":1,
"name":"Dan",
"email":"someemail@gmail.com",
"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"
}
}
}
}
Jede Hilfe wird geschätzt. Danke fürs Lesen.