팀원이 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-정의
예시가 도움이 되었다
예시에서 찾을 수 없었던 부분은 당일의 데이터를 처리하는 부분
우리는 날짜 기준으로 랭킹을 세기로 해서 특정일의 데이터만 가져오는게 필요했다
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까지 마쳐보았다
'사이드 프로젝트' 카테고리의 다른 글
트렌드 테스트 프로젝트 - 3. react에서의 nodejs api 사용, axios (0) | 2022.03.03 |
---|---|
트렌트 테스트 프로젝트 - 2. express 시작 및 mysql 연결 (0) | 2022.02.17 |
트렌트 테스트 프로젝트 - 1. aws 인스턴스 생성 및 사용자 추가 (0) | 2022.02.17 |