괴발개발/node.js
[Node.js 교과서] ch7. MySQL
ebulsok
2023. 2. 2. 17:52
Sequelize(Object Relation Mapping)
- npx sequelize init
- 자동으로 id를 기본키로 연결
- VARCHAR: STRING
- INT: INTEGER
- TINYINT: BOOLEAN
- DATETIME: DATE
models/user.js
- User 모델은 Sequelize.Model을 확장한 클래스로 선언, 크게 static init 메서드와 static associate 메서드로 나뉨
- init: 테이블에 대한 설정.
- super.init의 첫번째 인수가 테이블 컬럼에 대한 설정
- 두번째 인수가 테이블 자체에 대한 설정
- sequelize: static init 메서드의 매개변수와 연결되는 옵션, db.sequelize 객체를 넣어야 함
- timestamps: createdAt, updateAt 컬럼을 자동으로 추가함
- underscored: 스네이크 케이스로 변경(기본값: 캐멀케이스)
- modelName, tableName
- paranoid: true면 deleteAt 컬럼이 생겨서 시각이 기록됨
- charset, collate: 한글 입력 위함. 이모티콘까지 입력하고 싶으면 utf8mb4, utf8mb4_general_ci
- associate: 다른 모델과의 관계
- 1:N 관계를 hasMany-sourceKey로 표현, users 테이블의 로우 하나를 불러올 때 연결된 comments 테이블의 로우를 같이 불러올 수 있음.
- belongsTo-targetKey로 comments 테이블의 로우를 불러올 때 연결된 테이블의 로우를 가져올 수 있음
- 1:1 관계는 hasOne, N:M 관계는 belongsToMany-through 사용
쿼리
const { User } = require('../models');
// INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0, 'hi');
User.create({
name: 'zero',
age: 24,
married: false,
comment: 'hi',
});
// SELECT * FORM nodejs.users;
User.findAll({});
// SELECT * FORM nodejs.users LIMIT 1;
User.findOne({});
// SELECT name, married FROM nodejs.users;
User.findAll({
attributes: ['name', 'married'],
});
// SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30;
const { 0p } = require('sequelize);
User.findAll({
attributes: ['name', 'age'],
where: {
married: true,
age: { [op.gt]: 30},
},
});
// SELECT name, age FROM nodejs.users WHERE married = 1 OR age > 30;
const { 0p } = require('sequelize);
User.findAll({
attributes: ['name', 'age'],
where: {
[0p.or]: [{ married: false}, { age: { [op.gt]: 30 } }],
},
});
// SELECT id, name FROM nodejs.users ORDER BY age DESC LIMIT 1 OFFSET 1;
User.findAll({
attributes: ['id', 'name'],
order: [['age', 'DESC']],
limit: 1,
offset: 1,
});
// UPDATE nodejs.users SET comment = '바꿀 내용' WHERE id = 2;
User.update({
comment: '바꿀 내용',
}, {
where: { id: 2 },
});
// DELETE FROM nodejs.users WHERE id = 2;
User.destory({
where: { id: 2},
});
시퀄라이즈는 자바스크립트 객체를 사용해서 쿼리를 생성해야 하므로 특수한 연산자 사용
- 0p.gt: 초과
- 0p.gte: 이상
- 0p.lt: 미만
- 0p.lte: 이하
- 0p.ne: 같지 않음
- 0p.or: 또는
- 0p.in: 배열 요소 중 하나
- 0p.notIn: 배열 요소와 모두 다름
관계 쿼리
- get-: 조회
- set-: 수정
- add-: 하나 생성
- add-: 여러 개 생성
- remove-: 삭제
// 조회
const user = await User.findOne({
include: [{
model: Comment,
}]
}];
console.log(user.Comment);
const user = await User.findOne({});
const comments = await user.getComment();
console.log(comments);
// 관계를 설정할 때 as로 등록
db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id', as: 'Answers' });
// 쿼리
const user = await User.findOne({});
const comments = await user.getAnswers();
console.log(comments);
// 생성, 수정, 삭제
const user = await User.findOne({});
const comment = await Comment.create();
await user.addComment(comment); await user.addComment(comment.id);
// 배열
await user.addComment([comment1, comment2]);
SQL 쿼리 사용하기
const [result, metadata] = await sequelize.query('SELECT * from comments');