본문 바로가기

사이드 프로젝트

트렌드 테스트 프로젝트 - 4. sequelize 활용하여 데이터 다루기

팀원이 react, node, mysql 도커 세팅을 다 해주어서 나는 sequelize 쪽을 다뤄보았다

사실 팀원이 이 파트도 예제 만들어주긴해서 편하게 공부할 수 있었다

 

npx sequelize-cli init으로 sequelize 설정을 초기화 할 수 있다

user name, password, database등을 config.js에서 설정한다

 

처음에 npx 입력 안해줘서 command not found가 떴는데 npx를 앞에 넣어 입력하니 해결되었다

원인은 아직 파악 불가,,

 

먼저 rank 테이블 만들기

npx sequelize-cli model:generate --name Rank --attributes name:string,score:string

서버 최상단 폴더에서 위와 같은 명령어를 입력해주면 migration 파일과 model 파일이 생긴다

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
'use strict';
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Ranks', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      score: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('Ranks');
  }
};
cs

 

이렇게 만들어진 migration 파일이 디비 스키마를 결정한다

id와 createdAt, updatedAt은 자동생성

 

up은 만들때 down은 지울때!

 

디비에 적용할때는

npx sequelize-cli db:migrate

을 입력하면 실제 테이블이 생긴다

 

다음으로는 controller

https://kyounghwan01.github.io/blog/etc/sequelize/sequlize-basic-example/#controller-정의

 

Node.js + Express + MySQL + Sequelize example

Node.js + Express + MySQL + Sequelize example

kyounghwan01.github.io

예시가 도움이 되었다

 

예시에서 찾을 수 없었던 부분은 당일의 데이터를 처리하는 부분

우리는 날짜 기준으로 랭킹을 세기로 해서 특정일의 데이터만 가져오는게 필요했다

sql query로 짜라면 쉬울텐데 sequelize가 처음이라 조금 헷갈렸다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
exports.findToday = (req, res) => {
  Rank.findAll({ where: {
    createdAt: { 
      [Op.gt]: moment().format('YYYY-MM-DD 00:00:00'),
      [Op.lt]: moment().format('YYYY-MM-DD 23:59:59')
    },
  }, })
    .then(data => {
      res.send(data);
    })
    .catch(err => {
      res.status(500).send({
        message:
          err.message || "Some error occurred while retrieving ranks."
      });
    });
};
cs

 

이렇게 만들어진 날짜가 당일인 데이터들만 골라주었다

 

마지막으로는 seeders를 이용한 데이터 생성

npx sequelize-cli seed:generate --name ranks 로 ranks 데이터를 생성하는 파일을 만든다

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
'use strict';
 
module.exports = {
  async up (queryInterface, Sequelize) {
    let datas = [];
 
    /* Yesterday's data */
    for(let i = 0; i < 10; i++){
      let obj = {
        name"testUser_yesterday" + i,
        score: 100-10*i,
        createdAt: new Date(new Date().setDate(new Date().getDate()-1)).toISOString().replace(/T/' ').replace(/\..+/''),
        updatedAt: new Date(new Date().setDate(new Date().getDate()-1)).toISOString().replace(/T/' ').replace(/\..+/'')
      }
      datas.push(obj)
    }
 
    /* Today's data */
    for(let i = 0; i < 10; i++){
      let obj = {
        name"testUser_today" + i,
        score: 10*i,
        createdAt: new Date().toISOString().replace(/T/' ').replace(/\..+/''),
        updatedAt: new Date().toISOString().replace(/T/' ').replace(/\..+/'')
      }
      datas.push(obj)
    }
 
    return queryInterface.bulkInsert('Ranks', datas, {});
  },
 
  async down (queryInterface, Sequelize) {
    return queryInterface.bulkDelete('Ranks'null, {});
  }
};
 
cs

 

up, down 부분을 위와 같이 채워주었다

생성날의 데이터와 그 전날의 데이터로 당일의 데이터를 잘 가져오는지 비교해볼 예정이다

실제로 테스트 데이터를 디비에 넣기 위해 

npx sequelize-cli db:seed:all

로 생성해주었다

되돌리는건 npx sequelize-cli db:seed:undo:all

 

이렇게 예제 데이터까지 만들고 yarc를 사용하여 api test까지 마쳐보았다