Sequelize
는 비교적 단순한 select
절을 조회한다고 할때는 매우 간편하다.
하지만
subquery
를 from절에서 만들어서 하거나, 특정한 조건이 필요하는 등 데이터 조회가 조금 복잡해지면sequelize
를 사용하는 것이 훨씬 더 힘들어지는 것 같다. 일단 해당 문구를 위한sequelize
문법이나 api를 찾아봐야하는 것도 그렇지만, 찾아봤는데 지원을 안하는 경우도 있다...
그래서 기본 raw 쿼리를 짜서 할 때가 더 편할때가 있다. 다만 이경우 조회해온 결과를 바인딩하기 적합하게 조작을 가해야하는 작업이 생긴다.
sequelize는 left join문을 통해 실제쿼리상에 여러줄을 한개의 줄로 변경해주는데...이런 라이브러리가 있나 검색을 해봐도 찾지 못했음...있으면 참 편할텐데.. 이점이 sequelize사용하는데 내가 제일 좋아하는 부분이긴 하다.
MySQL에서 raw 쿼리를 쓸때는 {type: sequelize.OueryTypes.SELECT}
옵션을 사용해야한다. 안그러면 동일 결과가 두번씩 조회됨을 볼 수 있다.
// 쿼리예제는 단순한 쿼리를 듬.
import { sequelize } = require('../models')
router.get('/test', async (req, res, next) => {
try {
const query = `
select p.id, p.userId, u.nickname
from posts p
inner join users u p.userId = u.id
`
const result = await sequerlize.query(query, {
type: sequelize.OueryTypes.SELECT
}
} catch (err) {
console.error(err)
next(err)
}
}
그밖에 여러 옵션이 또 있는데 아래와 같다.
옵션*** | 설명 |
---|---|
nest | true시에 만약 알리아스가 dot이 포함되어 있다면 dot이 있을 때마다 nest된다. (디폴트 false: nest안됨) 단 nest true를 하면서 model mapping옵션을 주면 동작안함. |
이밖에 model, mapToModel, replacements, bind 옵션이 있음. 관련문서링크참조
OueryTypes -> QueryTypes로 오타 수정해주셔야 할 것 같습니다~