티스토리 뷰

개발 일지

sequelize 사용 팁 1편

Eseak 2023. 12. 14. 18:26
반응형

sequelize 사용 팁 1편
sequelize 사용 팁 1편

 

 

 

1. 원시 쿼리 (row query)로 조회하기

const user = await sequelize.query('select * from user where userId = 3');

 

이렇게 sequelize(sq) 의 query 함수를 이용하면 원시 쿼리문으로 조회가 가능합니다.

 

 

 

2. 원시 쿼리 조회 시 객체 중첩되지 않게 하기

const user = await sequelize.query(
	'select * from user where userId = 3',
    {
    	type: QueryTypes.SELECT
    },
);

 

 

type: QueryTypes.SELECT 를 추가해준다면 아래처럼 배열로 중첩되어 조회되었던 내용이

 

{
    "data": [
        [
            {
                "userId": 3
            }
        ],
        [
            {
                "userId": 3
            }
        ]
    ]
}

 

 

이렇게 중첩되지 않은 상태로 조회가 됩니다.

 

{
    "data": [
        {
            "userId": 3
        }
    ]
}

 

 

3. where 절 in 조회하기

in 조회는 두 가지 방법이 있습니다. 귀찮은 방법은 아래와 같은 방법있고,

 

User.findAll({
  where: {
    userId: { [Op.in]: [1,2,3] }
  }
});

 

 

만약 조금 더 간단히 사용하고 싶다면 아래와 같이 배열을 집어넣어 사용해도 정상적으로 동작합니다.

 

User.findAll({
  where: {
    userId: [1,2,3]
  }
});

 

 

4. hasMany 와 belongsTo

아래와 같이 userId를 fk로 가지고 있는 board 테이블이 있다고 가정하겠습니다.

 

User.init({
	userId: Sequelize.STRING,
	name: Sequelize.STRING
}, { sequelize, modelName: 'user' });


Board.init({
	boardId: Sequelize.STRING,
	userid: Sequelize.STRING,
	title: Sequelize.STRING,
	content: Sequelize.STRING
}, { sequelize, modelName: 'board' });

 

 

둘의 연관 관계를 설정하여 이후에 include 등을 사용할 때 문제없이 동작하도록 설정이 가능합니다.

 

이 때 constraints를 false 설정하면 순환 참조를 방지할 수 있습니다.

 

User.hasMany(DB.Board, { foreignKey: 'userId', constraints: false })
Board.belongsTo(DB.User, { foreignKey: 'userId', constraints: false })

 

 

 

5. include 로 join 하기

include 를 사용하여 다른 테이블을 join 할 수 있습니다. 이 때 아래와 같이 attributes 를 설정하면 원하는 컬럼만 조회하도록 설정이 가능합니다. 이는 주체가 되는 테이블에도 동일하게 적용이 가능합니다.

 

User.findAll({
  attributes: ['userId'],
  include: [
    { model: Board, attributes: ['content'] }
  ],
});

 

 

 

 

6. 조회 로직 기본 옵션 예제

아래와 같이 기본 옵션을 설정할 수 있습니다.

 

User.findAll({
    attributes: ['userId'],
    include: [
        { model: Board, attributes: ['content'] },
    ],
    where: {
        userId: 3,
    },
    order: [['userId', 'DESC']],
    limit: 1,
})

 

group byoperators 를 이용하는 방법은 차차 알아보겠습니다.

 

 

더 쓰고 싶은데 시간이 부족하네요.

 

부족한 내용은 2탄으로 더 작성하겠습니다.

반응형