1. Sequelize
- Sequelize는 Node.js를 위한 ORM(Object-Relational Mapping)으로, MySQL, MariaDB, PostgreSQL, SQLite, 그리고 MSSQL과 같은 SQL 기반의 데이터베이스를 지원한다.
- JavaScript, TypeScript와 모두 호환 가능하다.
- Sequelize를 사용하면 SQL 쿼리를 직접 작성하지 않고도 데이터베이스에서 데이터를 조회, 삽입, 수정, 삭제가 가능하다.
- 모델 기반의 접근 방식을 통해 코드의 가독성과 유지보수성을 향상시킬 수 있다. Mongoose와 거의 똑같다. 문법만 다름
2. Sequelize의 장점
- JS로 쿼리 짤 수 있음
- 다양한 SQL DB 지원
- Promise , async/await 지원함
- 자동화된 마이그레이션 관리
3. Sequelize의 단점
- 초기 학습곡선이 좀 있음
- Raw한 SQL에 비해 성능이슈가 있음. 항상 최적화된 쿼리를 생성하는 것은 아니기 때문이다.
- 매우 복잡한 쿼리는 그냥 생성하는게 나음
- NoSQL 지원 부족
4. 초기 세팅
- 설치 :
npm i @types/sequelize sequelize sequelize-cli
npx sequelize init
- 파일구조
models/users.ts
models/index.ts
root/db.ts
root/server.ts
controllers/test_controller.ts
5. Sequelize 쿼리
import User from './users';
// SQL INSERT
// INSERT INTO dbName.users (name, age, married, comment) VALUES ('name1', 20, 0, 'this is comment');
User.create({
name : 'name1',
age : 20,
married : false,
comment : 'this is comment'
})
// SQL READ 1
// SELECT * FROM dbName.users
User.findAll({});
// SQL READ 2
// SELECT name, married FROM dbName.users
User.findAll({
attributes : ['name', 'married']
});
//SQL READ 3
// SELECT name, age FROM dbName.users WHERE married = 1 AND age > 30;
import { Op } from 'sequelize';
User.findAll({
attributes : ['name', 'age'],
where:{
married : true,
age: { [Op.gt]: 30} //30 초과 (greater than)
}
})
//연산자
// Op.eq: 동일
// Op.ne: 다름
// Op.gt: 초과
// Op.gte: 이상
// Op.lt: 미만
// Op.lte: 이하
// 추가연산자
// Op.between: 값이 주어진 범위 내에 있는지 비교합니다.
// Op.notBetween: 값이 주어진 범위 내에 없는지 비교합니다.
// Op.in: 값이 주어진 배열 내에 있는지 비교합니다.
// Op.notIn: 값이 주어진 배열 내에 없는지 비교합니다.
// Op.like: 값이 주어진 패턴과 일치하는지 비교합니다.
// Op.notLike: 값이 주어진 패턴과 일치하지 않는지 비교합니다.
// Op.startsWith: 값이 주어진 접두사로 시작하는지 비교합니다.
// Op.endsWith: 값이 주어진 접미사로 끝나는지 비교합니다.
// Op.substring: 값이 주어진 부분 문자열을 포함하는지 비교합니다.
// 이러한 연산자들은 Sequelize의 쿼리에서 where 절에서 사용될 수 있습니다. 연산자를 사용하여 쿼리를 작성할 때 필요한 비교 조건을 정확하게 지정할 수 있습니다.
//SQL
// SELECT id,name FROM users ORDER BY age DESC, created_at ASC LIMIT 1 OFFSET 1;
User.findAll({
attributes: ['id', 'name'],
order: [['age', 'DESC'], ['created_at', 'ASC']],
limit : 1,
offset : 1
})
//SQL
// UPDATE dbName.users SET comment = '바꿀 내용' WHERE id = 2;
User.update(
{comment : '바꿀내용'},
{where : {id : 2} }
)
//SQL
// DELETE FROM dbName.users WHERE id = 2;
User.destroy({
where:{id : 2}
})
User.destroy({
where : {id : { [Op.in] : [1,3,5] } }
})
// 관계 쿼리
const example = async ()=>{
try{
const user = await User.findOne({
include : [{
model: Comment
}]
})
if (!user) throw new Error('error')
console.log(comments)
}
catch(err){
throw new Error(`미들웨어로 ${err}`)
}
}
// get모델명으로 관계 데이터 로딩 가능
// const user = await User.findOne({});
// const comments = await user.getComments();
// console.log(comments)
// Raw 쿼리 직접 사용하기
const [result, metadata] = await sequelize.query('SELECT * FROM users');
// metadata에는 쿼리 실행에 대한 추가 정보가 들어있다.
- 더 복잡한 쿼리는 chatGPT가 해줄거양
'Database > MySQL' 카테고리의 다른 글
[MySQL] 이것이 MySQL이다 (0) | 2024.03.25 |
---|---|
[MySQL] (완) 기본 문법 - 7 (0) | 2023.05.04 |
[MySQL] 기본 문법 - 6 (0) | 2023.05.04 |
[MySQL] 기본 문법 - 5 (0) | 2023.05.04 |
[MySQL] 기본 문법 - 4 (Join 개쉬움) (0) | 2023.05.04 |
댓글