07. NodeJS & MySQL

Kim Sang Yeob·2023년 1월 18일
0

NodeJS Book 3th

목록 보기
7/9
post-thumbnail

7.1 데이터베이스

1) 데이터베이스란

  • 지금까지는 데이터를 서버 메모리에 저장했음
    • 서버를 재시작하면 데이터도 사라져버림 -> 영구적으로 저장할 공간 필요
  • MySQL 관계형 데이터베이스 사용
    • 데이터베이스 : 관련성을 가지며 중복이 없는 데이터들의 집합
    • DBMS : 데이터베이스를 관리하는 시스템
    • RDBMS : 관계형 데이터베이스를 관리하는 시스템
    • 서버의 하드 디스크나 SSD 등의 저장 매체에 데이터를 저장
    • 서버 종료 여부와 상관 없이 데이터를 계속 사용할 수 있음
    • 여러 사람이 동시에 접근할 수 있고, 권한을 따로 줄 수 있음

7.2 MySQL 서버/워크벤치 설치하기

7.3 데이터베이스, 테이블 생성하기

1) 데이터베이스 생성하기

  • 콘솔에서 MySQL 프롬프트에 접속
    • CREATE SCHEMA nodejs; 로 nodejs 데이터베이스 생성
    • use nodejs; 로 생성한 데이터베이스 선택
mysql> CREATE SCHEMA nodejs DEFAULT CHARACTER SET utf8;
Query OK, 1row affected (0.01sec)

mysql> use nodejs;
Database changed

2) 테이블 생성하기

  • MySQL 프롬프트에서 테이블 생성
    • CREATE TABLE[데이터베이스명.테이블명]으로 테이블 생성
    • 사용자 정보를 저장하는 테이블
mysql> CREATE TABLE nodejs.users(
    -> id INT NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(20) NOT NULL,
    -> age INT UNSIGNED NOT NULL,
    -> married TINYINT NOT NULL,
    -> comment TEXT NULL,
    -> created_at DATETIME NOT NULL DEFAULT now(),
    -> PRIMARY KEY(id),
    -> UNIQUE INDEX name_UNIQUE (name ASC))
    -> COMMENT = '사용자 정보'
    -> DEFAULT CHARACTER SET = utf8;
Query OK, 0 rows affected (0.03 sec)

3) 컬럼과 로우

  • 나이, 결혼 여부, 성별같은 정보가 컬럼
  • 실제로 들어가는 데이터는 로우

4) 컬럼 옵션들

  • 컬럼명 옆의 것들은 컬럼에 대한 옵션들
  • 자료형
    • INT : 정수 자료형(FLOAT, DOUBLE은 실수)
    • VARCHAR : 문자열 자료형, 가변 길이(CHAR은 고정 길이)
    • TEXT : 긴 문자열은 TEXT로 별도 저장
    • DATATIME : 날짜 자료형 저장
    • TINYINT : -128에서 127까지 저장하지만 보통 1 또는 0만 저장해 bool 값 표현
  • 옵션
    • NOT NULL : 빈 값은 받지 않는다는 뜻 (NULL은 빈 값 허용)
    • AUTO_INCREMENT : 숫자 자료형인 경우 다음 로우가 저장될 때 자동으로 1 증가
    • UNSIGNED : 0과 양수만 허용 ( 숫자 자료형의 범위가 바뀜 )
    • ZEROFILL : 숫자의 자리 수가 고정된 경우 빈 자리에 0을 넣음
    • DEFAULT now() : 날짜 컬럼의 기본값을 현재 시간으로

5) Primary Key, Unique Index

  • PRIMARY KEY(id)
    • id가 테이블에서 로우를 특정할 수 있게 해주는 고유한 값임을 의미
    • 학번, 주민등록번호 같은 개념
  • UNIQUE INDEX name_UNIQUE (name ASC)
    • 해당 칼럼(name)이 고유해야 함을 나타내는 옵션
    • name_UNIQUE는 이 옵션의 이름(아무거나 다른 걸로 지어도 됨)
    • ASC는 인덱스를 오름차순으로 저장함의 의미(내림차순 DESC)

6) 테이블 옵션

  • COMMENT : 테이블에 대한 보충 설명 (필수 X)
  • DEFAULT CHARSET : utf8로 설정해야 한글이 입력됨 (utf8mb4 하면 이모티콘 가능)
  • ENGINE : InnoDB 사용 (이외에 MyISAM 이 있음. 엔진별로 기능 차이 존재)

7) 테이블 생성 확인

  • DESC 테이블명
mysql> DESC users;
+------------+--------------+------+-----+-------------------+-------------------+
| Field      | Type         | Null | Key | Default           | Extra             |
+------------+--------------+------+-----+-------------------+-------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment    |
| name       | varchar(20)  | NO   | UNI | NULL              |                   |
| age        | int unsigned | NO   |     | NULL              |                   |
| married    | tinyint      | NO   |     | NULL              |                   |
| comment    | text         | YES  |     | NULL              |                   |
| created_at | datetime     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+--------------+------+-----+-------------------+-------------------+
  • 테이블 삭제하기 : DROP TABLE 테이블명

8) 댓글 테이블 저장하기

mysql>  CREATE TABLE nodejs.comments(
    -> id INT NOT NULL AUTO_INCREMENT,
    -> commenter INT NOT NULL,
    -> comment VARCHAR(100) NOT NULL,
    -> created_at DATETIME NOT NULL DEFAULT now(),
    -> PRIMARY KEY(id),
    -> INDEX commenter_idx (commenter ASC),
    -> CONSTRAINT commenter
    -> FOREIGN KEY (commenter)
    -> REFERENCES nodejs.users (id)
    -> on DELETE CASCADE
    -> on UPDATE CASCADE)
    -> COMMENT = '댓글'
    -> DEFAULT CHARSET=utf8mb4
    -> ENGINE=InnoDB;
Query OK, 0 rows affected (0.04 sec)

9) 외래키(foreign key)

  • 댓글 테이블은 사용자 테이블과 관계가 있음 (사용자가 댓글을 달기 때문)
    • 외래키를 두어 두 테이블이 관계가 있다는 것을 표시
    • FOREIGN KEY (컬럼명) REFERENCES 데이터베이스.테이블명 (컬럼)
    • ex) FOREIGN KEY (commenter) REFERENCES nodejs.users (id)
    • ON DELETE CASCADE, ON UPDATE CASCADE
    • 사용자 테이블의 로우가 지워지고 수정될 때 댓글 테이블의 연관된 로우들도 같이 지워지고 수정됨
    • 데이터를 일치시키기 위해 사용하는 옵션 (CASCADE 대신 SET NULL과 NO ACTION도 있음)

10) 테이블 목록 보기

  • SHOW TABLES;
mysql> SHOW TABLES;
+------------------+
| Tables_in_nodejs |
+------------------+
| comments         |
| users            |
+------------------+
2 rows in set (0.00 sec)

11) MySQL 워크밴치로 테이블 만들기

  • 찾아보기..

7.4 CURD 작업하기

1) CURD

  • Create, Update, Read, Delete의 두문자어

2) Create

  • INSERT INTO 테이블 (컬럼명들) VALUES (값들)
mysql> INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0, '자기소개1');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO nodejs.users (name, age, married, comment) VALUES ('nero', 32, 1, '자기소개2');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO nodejs.comments (commenter, comment) VALUES (1, '안녕하세요. zero의 댓글입니다');
Query OK, 1 row affected (0.01 sec)

3) Read

SELECT 칼럼 FROM 테이블명

  • SELECT * 은 모든 칼럼을 선택한다는 의미
mysql> SELECT * FROM nodejs.users;
+----+------+-----+---------+-----------+---------------------+
| id | name | age | married | comment   | created_at          |
+----+------+-----+---------+-----------+---------------------+
|  1 | zero |  24 |       0 | 자기소개1 | 2023-01-19 18:35:02 |
|  2 | nero |  32 |       1 | 자기소개2 | 2023-01-19 18:35:24 |
+----+------+-----+---------+-----------+---------------------+
2 rows in set (0.00 sec)
  • 칼럼만 따로 추리는 것도 가능
mysql> SELECT name, married FROM nodejs.users;
+------+---------+
| name | married |
+------+---------+
| zero |       0 |
| nero |       1 |
+------+---------+
2 rows in set (0.00 sec)

4) Read 옵션들

WHERE로 조건을 주어 선택 가능

  • AND로 여러가지 조건을 동시에 만족하는 것을 찾음
mysql> SELECT id, name, age, married FROM nodejs.users WHERE married = 1 AND age > 30;
+----+------+-----+---------+
| id | name | age | married |
+----+------+-----+---------+
|  2 | nero |  32 |       1 |
+----+------+-----+---------+
1 row in set (0.00 sec)
  • OR로 여러가지 조건 중 하나 이상을 만족하는 것을 찾음
mysql> SELECT id, name, age, married FROM nodejs.users WHERE married = 0 OR age > 30;
+----+------+-----+---------+
| id | name | age | married |
+----+------+-----+---------+
|  1 | zero |  24 |       0 |
|  2 | nero |  32 |       1 |
+----+------+-----+---------+
2 rows in set (0.00 sec)

5) 정렬해서 찾기

ORDER BY로 특정 칼럼 값 순서대로 정렬 가능

  • DESC는 내림차순, ASC는 오름차순
mysql> SELECT id, name, age FROM nodejs.users ORDER BY age DESC;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  2 | nero |  32 |
|  1 | zero |  24 |
+----+------+-----+
2 rows in set (0.00 sec)

mysql> SELECT id, name, age FROM nodejs.users ORDER BY age ASC;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | zero |  24 |
|  2 | nero |  32 |
+----+------+-----+
2 rows in set (0.00 sec)

6) LIMIT, OFFSET

  • LIMIT으로 조회할 개수 제한
mysql> SELECT id, name, age FROM nodejs.users ORDER BY age DESC LIMIT 1;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  2 | nero |  32 |
+----+------+-----+
1 row in set (0.00 sec)
  • OFFSET으로 앞의 로우들 스킵 가능 (OFFSET 2면 세 번째 것부터 찾음)
mysql> SELECT id, name, age FROM nodejs.users ORDER BY age DESC LIMIT 1 OFFSET 1;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | zero |  24 |
+----+------+-----+
1 row in set (0.00 sec)

7) Update

  • 데이터베이스에 있는 데이터를 수정하는 작업
    • UPDATE 테이블명 SET 칼럼=새값 WHERE 조건
mysql> UPDATE nodejs.users SET comment='내용 바뀜' WHERE id = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM nodejs.users;
+----+------+-----+---------+-----------+---------------------+
| id | name | age | married | comment   | created_at          |
+----+------+-----+---------+-----------+---------------------+
|  1 | zero |  24 |       0 | 자기소개1 | 2023-01-19 18:35:02 |
|  2 | nero |  32 |       1 | 내용 바뀜 | 2023-01-19 18:35:24 |
+----+------+-----+---------+-----------+---------------------+
2 rows in set (0.00 sec)

8) Delete

  • 데이터베이스에 있는 데이터를 삭제하는 작업
    • DELETE FROM 테이블명 WHERE 조건
mysql> DELETE FROM nodejs.users WHERE id = 2;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM nodejs.users;
+----+------+-----+---------+-----------+---------------------+
| id | name | age | married | comment   | created_at          |
+----+------+-----+---------+-----------+---------------------+
|  1 | zero |  24 |       0 | 자기소개1 | 2023-01-19 18:35:02 |
+----+------+-----+---------+-----------+---------------------+
1 row in set (0.00 sec)

7.5 시퀄라이즈 사용하기

1) 시퀄라이즈 ORM

  • MySQL 작업을 쉽게 할 수 있도록 도와주는 라이브러리
    • ORM : Object Relational Mapping : 객체와 데이터를 매핑 (1대1 짝지음)
    • MySQL 이외에도 다른 RDB(Maria, Postgre, SQLite, MSSQL)와도 호환됨
    • 자바스크립트 문법으로 데이터베이스 조작 가능
  • 시퀄라이즈 예제는 github repo
    • 프로젝트 세팅 후, 콘솔을 통해 경로로 이동한 후 package.josn 작성
{
    "name": "learn-sequelize",
    "version": "0.0.1",
    "description": "시퀄라이즈를 배우자",
    "main": "app.js",
    "scripts": {
        "start":  "nodemon app"
    },
    "author": "yeobi01",
    "license": "MIT"
}

2) 시퀄라이즈 CLI 사용하기

  • 시퀄라이즈 명령어 사용하기 위해 sequelize-cli 설치
    • mysql2는 MySQL DB가 아닌 드라이버(Node.js와 MySQL을 이어주는 역할)
$ npm i express morgan nunjucks sequelize sequelize-cli mysql2
$ npm i -D nodemon
  • npx sequelize init으로 시퀄라이즈 구조 생성
$ npx sequelize init      
Sequelize CLI [Node: 18.12.1, CLI: 6.5.2, ORM: 6.28.0]
Created "config\config.json"
Successfully created models folder at ...
Successfully created migrations folder at ...
Successfully created seeders folder at ...

3) modes/index.js 수정

  • 다음과 같이 수정
    • require(../config/config) 설정 로딩
    • new Sequelize(옵션들...)로 DB와 연결 가능
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require('/../config/config.json')[env];
const db = {};


const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.Sequelize = Sequelize;

module.exports = db;

4) MySQL 연결하기

  • app.js 작성
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');

const { sequelize } = require('./models');

const app = express();
app.set('port', process.env.PORT || 3001);
app.set('view engine', 'html');
nunjucks.configure('views', {
    express: app,
    watch: true,
});
sequelize.sync({ force: false})
    .then(() => {
        console.log('데이터베이스 연결 성공');
    })
    .catch((err) => {
        console.error(err);
    });

app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded( {extended: false} ));

app.use((req, res, next) => {
    const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
    error.status = 404;
    next(error);
});

app.use((err, req, res, next) => {
    res.locals.message = err.message;
    res.locals.error = process.env.NODE_ENV != 'production' ? err : {};
    res.status(err.status || 500);
    res.render('error');
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기 중');
});

5) config.json 설정하기

  • development 객체 안에 password와 database 수정하기

6) 연결 테스트하기

  • npm start로 실행해서 SELECT 1+1 AS RESULT가 나오면 연결 성공
$ npm start

> learn-sequelize@0.0.1 start
> nodemon app

[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
3001 번 포트에서 대기 중
Executing (default): SELECT 1+1 AS result
데이터베이스 연결 성공

7) 모델 생성하기 (테이블 생성)

  • user.js 작성
const Sequelize = require('sequelize');

class User extends Sequelize.Model {
    static initiate(sequelize){
        User.init({
            name: {
                type: Sequelize.STRING(20),
                allowNull: false,
                unique: true,
            },
            age: {
                type: Sequelize.INTEGER.UNSIGNED,
                allowNull: false,
            },
            married: {
                type: Sequelize.BOOLEAN, // ture false
                allowNull: false,
            },
            comment: {
                type: Sequelize.TEXT,
                allowNull: true,
            },
            created_at: {
                type: Sequelize.DATE, // DATETIME, MySQL DATE -> Sequelize DateOnly
                allowNull: false,
                defaultValue: Sequelize.NOW,
            },
        }, {
            sequelize,
            timestamps: false,
            underscored: false,
            paranoid: false,
            modelName: 'User',
            tableName: 'users',
            charset: 'utf8',
            collate: 'utf8_general_ci',
        });
    }

    static associate(db) {
        db.User.hasMany(db.Comment, { ForeignKey: 'commenter', sourceKey: 'id'});
    }
};

module.exports = User;

8) 모델 옵션들

  • 시퀄라이즈 모델의 자료형은 MySQL의 자료형과 조금 다름
MySQL시퀄라이즈
VARCHAR(100)STRING(100)
INTINTEGER
TINYINTBOOLEAN
DATETIMEDATE
INT UNSIGNEDINTEGER.UNSIGNED
NOT NULLallowNull: false
UNIQUEunique: true
DEFAULT now()defaultValue: Sequelize.NOW
  • define 메서드의 세 번째 인자는 테이블 옵션
    • timestamps: true면 createdAt(생성 시간), updatedAt(수정 시간) 컬럼을 자동으로 만들어줌
    • 예제에서는 직접 created_at 컬럼을 만들었으므로 false로 함
    • paranoid 옵션은 true면 deletedAt(삭제 시간) 컬럼을 만듦, 로우 복구를 위해 완전히 삭제하지 않고 deletedAt에 표시해둠
    • underscored 옵션은 캐멀케이스로 생성되는 칼럼을 스네이크케이스로 생성
    • modelName은 모델 이름, tableName 옵션은 테이블 이름을 설정
    • charset과 collate는 한글 설정을 위해 필요(이모티콘 넣으려면 utf8mb4로)

9) 댓글 모델 생성하기

  • comment.js 작성
const Sequelize = require('sequelize');

class Comment extends Sequelize.Model{
    static initiate(sequelize){
        Comment.init({
            comment: {
                type: Sequelize.STRING(100),
                allowNull: false,
            },
            created_at: {
                type: Sequelize.DATE,
                allowNull: true,
                defaultValue: Sequelize.NOW,
            },
        }, {
            sequelize,
            timestamps: false,
            modelName: 'Comment',
            tableName: 'comments',
            paranoid: false,
            charset: 'utfmb4',
            collate: 'utf8mb4_general_ci',
        });
    }

    static associate(db) {
        db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id'});
    }
};

module.exports = Comment;

10) 댓글 모델 활성화하기

  • index.js에서 모델 연결
    • init으로 sequelize와 연결
    • associate로 관계 설정
const Sequelize = require('sequelize');
const User = require('./user');
const Comment = require('./comment');

const env = process.env.NODE_ENV || 'development';
const config = require('../config/config.json')[env];
const db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);

db.sequelize = sequelize;

db.User = User;
db.Comment = Comment;

User.initiate(sequelize);
Comment.initiate(sequelize); 

User.associate(db);
Comment.associate(db);

module.exports = db;

11) 관계 정의하기

  • users 모델과 comments 모델 간의 관계를 정의
    • 1:N 관계 (사용자 한 명이 댓글 여러개 작성)
    • 시퀄라이즈는 1:N 관계를 hasMany로 표현(사용자.hasMany(댓글))
    • 반대의 입장에서는 belongsTo(댓글.belongsTo(사용자))
    • belongsTo가 있는 테이블에 컬럼이 생김(댓글 테이블에 commenter 컬럼)
// user.js
...
    static associate(db) {
        db.User.hasMany(db.Comment, { ForeignKey: 'commenter', sourceKey: 'id'});
    }
};

// comment.js
...
    static associate(db) {
        db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id'});
    }
};

12) 1대 1 관계

  • 사용자 테이블과 사용자 정보 테이블
  • foreignKey를 누구에게 줄 것인지를 생각하고 관계를 결정
db.User.hasOne(db.Info, { foreignKey: 'UserId', sourceKey: 'id' });
db.Info.belongsTo(db.User, { foreignKey: 'UserId', targetKey: 'id' });

13) N대 M 관계

  • 게시글과 해시태그 테이블
  • 하나의 게시글이 여러 개의 해시태그를 가질 수 있고 하나의 해시태그가 여러 개의 게시글을 가질 수 있음
  • DB 특성상 다대다 관계는 중간 테이블이 생김
  • 하나의 컬럼에 두 개의 정보를 넣는 것은 정규화 원칙을 어기기 때문에 하나의 테이블이 더 생김
  • 역정규화도 존재하기는 함..
db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });

14) 시퀄라이즈 쿼리 알아보기

  • 윗 줄이 SQL문, 아랫 줄은 시퀄라이즈 쿼리(JS)
const { User } = require('../models');

// INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0, '자기소개1');
User.create({
  name: 'zero',
  age: 24,
  married: false,
  comment: '자기소개1',
});

// SELECT * FROM nodejs.users;
User.findAll({});

// SELECT name, married FROM nodejs.users;
User.findAll({
  attributes: ['name', 'married'],
});
  • 특수한 기능들인 경우 Sequelize.Op의 연산자 사용(gt, or 등)
const { OP } = require('sequelize'); // gt, it, gte, ite, in, ne 사용 가능
const { User } = require('../models');

// SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30;
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 { OP } = require('sequelize');
const { User } = require('../models');
User.findAll({
  attributes: ['name', 'age'],
  where: {
    [Op.or]: [{ married: 0 }, { age: { [Op.gt]: 30} }],
  };
});
  • ORER BY 사용하기
  • 2차원 배열인 경우에는 같은 경우 다음 조건을 사용해야하기 때문
// SELECT id, name FROM users ORDER BY age DESC;
User.findAll({
  attributes: ['id', 'name'],
  order: [['age', 'DESC']],
});

// SELECT id, name FROM users ORDER BY age DESC LIMIT 1;
User.findAll({
  attributes: ['id', 'name'],
  order: [['age', 'DESC']],
  limit: 1,
});

// SELECT id, name FROM 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 },
});

15) 관계 쿼리

  • 결과값이 자바스크립트 객체임
const user = await User.findOne({});
console.log(user.nick); // 사용자 닉네임
  • include로 JOIN과 비슷한 기능 수행 가능(관계 있는 것 엮을 수 있음)
const user = await User.findOne({
  include: [{
    modle: Comment,
  }]
});
consolt.log(user.Comments); // 사용자 댓글
  • 다대다 모델은 다음과 같이 접근 가능
db.sequelize.models.PstHashtag
  • get+모델명으로 관계 있는 데이터 로딩 가능
const user = await User.findOne({});
const comments = await user.getComments();
console.log(comments); // 사용자 댓글
  • as로 모델명 변경 가능 / 자주사용 비추천
// 관계를 설정할 때 as로 등록
db.User.hasMany(db.Comment, { foregin: 'commenter', sourceKey: 'id', as: 'Answers' });
// 쿼리할 때는
const user = await User.findOne({});
const comments = await user.getAnswers();
console.log(comments); // 사용자 댓글
  • include나 관계 쿼리 메서드에도 where나 attributes
const user = await User.findOne({
  include: [{
  	modle: Comment,
    where: {
      id: 1,
    },
    attributes: ['id'],
  }]
});
// 또는
const comments = await user.getComments({
  where: {
    id: 1,
  },
  attributes: ['id'],
});
  • 생성 쿼리
const user = await User.findOne({});
const comment = await Comment.create();
await user.addComment(comment);
// 또는
await user.addComment(comment.id);
  • 여러 개를 추가할 때는 배열로 추가 가능
const user = await User.findOne({});
const comment1 = await Comment.create();
const comment2 = await Comment.create();
await user.addComment([comment1, comment2]);
  • 수정은 set+모델명, 삭제는 remove+모델명

16) raw 쿼리

  • 직접 SQL을 쓸 수 있음
const [result, metadata] = await sequelize.query('SELECT * FROM comments');
console.log(result);

7.6 시퀄라이즈 실습

Github repo

profile
Studying NodeJS...

0개의 댓글