typeORM

Younghwan Cha·2023년 4월 15일
0

Query Builder

정해진 typeORM 만으로는 모든 종류의 쿼리들을 표현하는 데 한계가 있다.
이러한 단점을 보완하기 위한 것이 바로 query buidler 이다.

this.testRepository
  .createQueryBuilder('test') // FROM test test 와 같이 이름 지정
  .select('test_id')         
  .addSelect('COUNT(*)::integer')
  .where(...)
  .andwhere(new Brackets(qb => {
  	qb.where('test.test_status = :test_status', { test_status: 'yes' })
      .orWhere('test.test_status = :test_status', { test_status: 'host' })
    }))  
  .groupBy('test_id')
  .getRawMany();

typeORM 에서는 join 을 어떻게 구현할까?

LEFT JOIN

leftJoin('<기준이 되는 테이블>.<연결할 엔티티>', '<연결할 엔티티가 사용할 이름>')

join 을 원할 경우에는 join 하려는 entity 들에 각각 manyToOne 또는 OneToMany 관계를 정의해주어야 한다.
예시로는 여기 를 참고해보자.

[gitbook query builder] https://orkhan.gitbook.io/typeorm/docs/select-query-builder
[typeORM] https://typeorm.io
https://itchallenger.tistory.com/231

결과값 반환하기

QueryBuilder 를 통해서 반환 받은 데이터의 종류에는 크게 두가지가 존재하는데, Entity type 또는 Raw Result 이다.
대부분의 경우 결과값으로 DB 의 entity 를 반환 받지만, 특정 연산을 하거나 특정 column 만을 반환 받을 경우와 같이
raw data 를 반환 받아야 하는 경우가 생긴다. 각각의 경우에 사용하는 함수를 분류해보면 다음과 같다

  • Entity Type

getOne | getMany: Promise<Entity[]> {}
getOne(), getMany()를 이용해서 데이터를 조회할 경우, entity class instance 를 반환하기 때문에 특정 Column 들만 가져오는 경우에, getOne() 또는 getMany() 를 쓰게 되면 문제가 일어날 수 있다.

  • Raw Result

getRawOne | getRawMany<T = any>(): Promise<T[]> {}


PrimaryColumn

  • PrimaryGeneratedColumn

자동생성되는 ID값을 표현하는 방식을 아래와 같이 2가지 옵션을 사용할 수 있도록 도와준다

increment: AUTO_INCREMENT를 사용해서 1씩 증가하는 ID를 부여한다. 기본 옵션이다.
uuid: 유니크한 uuid를 사용할 수 있다.

// using increment
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number
}

// using uuid
@Entity()
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string
}

https://yangeok.github.io/orm/2020/12/14/typeorm-decorators.html

profile
개발 기록

0개의 댓글