row_to_json()
PostgreSQL 9.2에 추가 된 함수를 사용하여 쿼리 결과를 JSON에 매핑하려고합니다 .
결합 된 행을 중첩 된 객체로 표현하는 가장 좋은 방법을 찾는 데 문제가 있습니다 (1 : 1 관계).
다음은 내가 시도한 것입니다 (설정 코드 : 테이블, 샘플 데이터, 쿼리) :
-- 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$$;
쿼리 자체 :
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;
를 사용 ROW()
하면 결과 필드를 자식 개체로 분리 할 수 있지만 단일 수준으로 제한되는 것 같습니다. AS XXX
이 경우에 필요하다고 생각하는 문을 더 삽입 할 수 없습니다 .
예를 들어 ::user_roles
해당 테이블의 결과의 경우 를 사용하여 적절한 레코드 유형으로 캐스트하기 때문에 열 이름이 제공됩니다 .
이 쿼리가 반환하는 내용은 다음과 같습니다.
{
"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"
}
}
}
}
제가하고 싶은 것은 조인을 추가 할 수있는 방식으로 조인을위한 JSON을 생성하는 것입니다 (1 : 1은 괜찮습니다). 조인이 조인하는 부모의 자식 개체로 표현되도록하는 것입니다.
{
"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"
}
}
}
}
도움을 주시면 감사하겠습니다. 읽어 주셔서 감사합니다.