Node.js
[Node.js] sequelize 쿼리
오늘보다 더 나은 내일을 위해
2022. 4. 19. 10:10
데이터 삽입 (INSERT 쿼리)
create
const jennie = await User.create({
name : "JENNIE",
age: 25,
married : false,
comment: "Jennie comment"
});
// INSERT INTO users(name, age, married, comment) VALUES("JENNIE", 25, false, "Jennie comment")
결과 값
console.log(jennie)
User {
dataValues: {
created_at: 2022-04-06T06:25:49.678Z,
id: 1,
name: 'JENNIE',
age: 25,
married: false,
comment: 'Jennie comment'
},
_previousDataValues: {
name: 'JENNIE',
age: 25,
married: false,
comment: 'Jennie comment',
id: 1,
created_at: 2022-04-06T06:25:49.678Z
},
uniqno: 1,
_changed: Set(0) {},
_options: {
isNewRecord: true,
_schema: null,
_schemaDelimiter: '',
attributes: undefined,
include: undefined,
raw: undefined,
silent: undefined
},
isNewRecord: false
}
findOrCreate
데이터 조회 후 테이블에 없는 값이면 생성하고 있으면 그 값을 가져오는 메소드
const sandrara = await User.findOrCreate({
where: { name: "sandara" }, // 1. 조건에 해당하는 데이터가 있는지 찾아줌
defaults: { age: "23" }, // 2. 없다면 테이블에 없는 값이면 이 옵션에 넣어준 데이터도 함께 삽입 됨
});
데이터 조회 (SELECT 쿼리)
findAll
쿼리 결과를 배열 객체로 반환
const users = await User.findAll({});
// SELECT * FROM users
결과 값
[
User {
dataValues: {
id: 1,
name: 'JENNIE',
age: 25,
married: false,
comment: 'Jennie comment',
created_at: 2022-04-06T06:25:49.000Z
},
...
},
User {
dataValues: {
id: 2,
name: 'lisa',
age: 20,
married: true,
comment: 'Lisa comment',
created_at: 2022-04-08T00:53:24.000Z
},
...
]
findOne
쿼리 결과를 객체로 반환
해당되는 결과값이 여러개 있어도 1개만 반환 된다
const users = await User.findOne({});
// SELECT `id`, `name`, `age`, `married`, `comment`, `created_at` FROM `users` AS `User` LIMIT 1;
결과 값
User {
dataValues: {
id: 1,
name: 'JENNIE',
age: 25,
married: false,
comment: 'Jennie comment',
created_at: 2022-04-06T06:25:49.000Z
},
...
}
조건 조회 (attributes, where)
attributes 옵션을 통해 원하는 컬럼만 가져 올 수 있다
where 옵션을 통해 조건을 걸어줄 수 있다.
const users = await User.findAll({
attributes: ["id", "name", "age", "comment"],
where: {
married: false,
},
});
// SELECT id, name, age, comment FROM users WHERE married = 1
where에서는 AND가 디폴트이기 떼문에 다른 연산을 적용하고 싶다면 sequelize의 Op객체를 사용해야 한다
자주 쓰이는 Op 연산
Op.gt | 초과 |
Op.gte | 이상 |
Op.lt | 미만 |
Op.lte | 이하 |
Op.ne | 같지 않음 |
Op.or | 또는 |
Op.and | 그리고 |
Op.in | 배열 요소 중 하나 |
Op.notIn | 배열 요소와 모두 다름 |
const { Op } = require("sequelize");
const users = await User.findAll({
where: {
[Op.and]: [{ authorId: 12 }, { status: "active" }], // WHERE authorId=12 AND status='active'
[Op.or]: [{ authorId: 12 }, { authorId: 13 }], // WHERE authorId=12 OR authorId=13
authorId: { [Op.or]: [12, 13] }, // WHERE authorId=12 OR authorId=13
[Op.eq]: 3, // =3
[Op.ne]: 20, // != 20
[Op.is]: null, // IS NULL
[Op.not]: true, // IS NOT NULL
[Op.or]: [5, 6], // =5 OR =6
[Op.col]: "user.organization_id", // = user.organization_id (user 테이블의 organization_id값과 같은지)
[Op.gt]: 6, // > 6
[Op.gte]: 6, // >= 6
[Op.lt]: 10, // < 10
[Op.lte]: 10, // <= 10
[Op.between]: [6, 10], // BETWEEN 6 AND 10
[Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15
[Op.in]: [1, 2], // [Op.in]:[1, 2] == [1, 2], IN [1, 2]
[Op.notIn]: [1, 2], // NOT IN [1, 2]
[Op.like]: "%hat", // LIKE '%hat'
[Op.notLike]: "%hat", // NOT LIKE '%hat'
[Op.startsWith]: "hat", // LIKE 'hat%'
[Op.endsWith]: "hat", // LIKE '%hat'
[Op.substring]: "hat", // LIKE '%hat%'
},
});
정렬 (order)
User.findAll({
order: [ ['age', 'DESC'], ['name', 'ASC'] ]
});
// SELECT id, name FROM users ORDER BY age DESC name ASC;
limit, offset
User.findAll({
attributes: ['name', 'age'],
order: [['age', 'DESC']],
limit: 10,
offset: 5,
});
// SELECT name, age FROM useres ORDER BY age DESC LIMIT 10 OFFSET 5
데이터 수정 (UPDATE 쿼리)
User.update({
comment: 'NEW Comment', // 수정할 내용
}, {
where: {id:2}, // 조건
});
// UPDATE users SET comment='NEW Comment' WHERE id=2
데이터 삭제 (DELETE 쿼리)
User.destroy({
where: {id:2}
});
// DELETE FROM users WHERE id=2
User.destroy({
where: {id: {[Op.in]: [1,3,5]} }
});
// DELETE FROM users WHERE id in(1,3,5)
JOIN
await User.findOne({
include: [
{
model: Comment,
},
],
});
// SELECT * FROM users LEFT JOIN model ON users.id=comments.commenter
raw query 사용하기
const users = await sequelize.query("SELECT * FROM `users`", { type: QueryTypes.SELECT });