괴발개발/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');