Back-end/nest.js
TypeORM : Postgresql 42703 에러 ( + as 사용시 소문자만 나오는 경우 해결법)
hsloth
2023. 3. 11. 16:54
TypeOrm으로 Postgresql 이용 도중 Select 문을 사용하다가 발견한 에러이다.
driverError: error: column "a.createdAt" does not exist
code: '42703' error
let query = this.articleRepository
.createQueryBuilder('a')
.select([
'a.id as id',
'a.title as title',
'a.createdAt as createdAt',
]);
...
query = query.orderBy('createdAt', 'DESC');
게시글 목록을 불러오기 위하여 대충 위처럼 코드를 짰다. (완전 똑같지는 않다)
그런데, as를 썼는데 return 값이 createdAt이 아닌 createat으로 소문자로 나오는 게 문제였다.
그래서 해결방법을 찾았다. 그것은 바로 따옴표를 붙이는 것
let query = this.articleRepository
.createQueryBuilder('a')
.select([
'a.id as "id"',
'a.title as "title"',
'a.createdAt as "createdAt"',
]);
...
query = query.orderBy('createdAt', 'DESC');
그래서 위처럼 코드를 변경했다. 그런데....
driverError: error: column "a.createdAt" does not exist
라는 에러가 계속 발생하였다. 그래서 뭐가 문제지 하고 코드를 이것저것 살펴본 결과
orderBy가 문제였다.
그래서 아래와 같이 orderBy에 따옴표를 붙여주면 된다. (왜 자동으로 안 붙여주는지 모르겠다 ㅠ)
let query = this.articleRepository
.createQueryBuilder('a')
.select([
'a.id as "id"',
'a.title as "title"',
'a.createdAt as "createdAt"',
]);
...
query = query.orderBy('"createdAt"', 'DESC');
나는 변수 사용을 위해 백틱을 써서 query.orderBy(`${order.type}`, `${order.order}`);
와 같이 사용했었는데 어쩌면 백틱때문일지도 모른다.