IT Study/DB

[TypeORM] QueryBuilder | SELECT 절에서 as 사용하기 (with. getMany vs getRawMany)

짹짹체유 2024. 1. 24. 01:06
사용 언어 및 Stack: Nest.js, TypeORM, PostgreSQL

 

맞닥드린 문제: alias를 활용해서 변수명을 변경하고 싶다.

 

기본적인 SQL문은 SELECT 절에서 'as 별명'을 통해 변수명을 변경한다.

그러나 TypeORM에서도 동일하게 as를 넣어보면 적용이 되지 않는다는 것을 알 수 있다.

 

"as"를 적용한 totalCalories 컬럼만 출력되지 않았다.

 

구글링 결과, getMany()가 아닌 getRawMany()를 적용해보았다.

 

변수명들이 변경된 것을 볼 수 있다.


getMany() vs getRawMany()

[ TypeORM 문서 ]
" There are two types of results you can get using select query builder: entities or raw results. Most of the time, you need to select real entities from your database, for example, users. For this purpose, you use getOne and getMany. But sometimes you need to select some specific data, let's say the sum of all user photos. This data is not an entity, it's called raw data. To get raw data, you use getRawOne and getRawMany. "

 

QueryBuilder를 사용해서 얻을 수 있는 결과에는 EntityRaw Result의 두 가지 유형이 있다.

대부분의 경우에는 데이터베이스에서 실제 Entity를 선택해야 한다. 이를 위해서는 getOne()과 getMany()를 사용한다. 하지만 때로는 '합계'와 같은 특정 데이터를 선택해야하는 경우도 있다. 이런 경우에는 Raw Result라고 하며 getRawOne()과 getRawMany()를 사용한다.

 

 

getMany

Entity 객체를 반환한다. ( Promise < Entity[] >를 return )

특정 컬럼만 가져오는 경우에는 잠재적인 문제가 발생할 수 있다.

as alias가 적용되지 않는다.

서브 쿼리가 적용되지 않는다.

 

 

getRawMany

쿼리 결과를 직접적으로 반환한다. ( Promise < T[] >를 return )

as alias가 적용된다.

서브쿼리가 적용된다.

getRawMany()의 return 타입은 any이고, 실제로 plain object

→ 타입스크립트 컴파일러가 메서드를 통해서 얻을 수 있는 데이터의 형태가 무엇인지, 어떤 클래스의 인스턴스인지를 알 수가 없게 되었다.

 

 

데이터의 형태를 명확하게 하기 위해 대체로 예제 코드들에서는 getMany를 많이 사용하는 것을 볼 수 있었다.

 


 

앞에서 getRawMany를 사용해서 변수명이 변경되었다.

그러나 나는 카멜케이스로 변경되기를 원했지만 모두 소문자로 표시되었다.

 

addSelect()를 사용해서 각 컬럼을 각각 별명과 함께 작성해주니, 내가 원하는 대로 카멜케이스로 변수명이 표시되었다.

 


 

위와 동일한 쿼리빌더에서 getRawMany()를 getMany()로 적용하면 어떻게 될까?

 

쿼리가 작동하지 않는다.

 

getMany()를 활용할 수 있는 쿼리로도 다시 고민을 해봐야할 것 같다.

 

 

 

 


 

참고자료

https://orkhan.gitbook.io/typeorm/docs/select-query-builder#getting-values-using-querybuilder

https://threeyears.tistory.com/m/417

https://velog.io/@youngkiu/TypeORM-getMany-vs-getRawMany

https://seungtaek-overflow.tistory.com/19

 

 

반응형