[SeSACX코딩온] Sequelize

JUHEE·2024년 2월 20일
0

SeSACX코딩온

목록 보기
11/26

Sequelize문법

JOIN

- Sequelize의 join은 include를 사용하여 작성한다
- include: [{model: join하려는모델}]
- 관계가설정된 테이블을 대상으로 기본적으로 innerjoin된다
- 관계(relationship)는 아래에서 자세히 다룬다
- 예시코드

const models = require('../models');

models.User.findOne({
	where: {id: req.body.id, pw: req.body.pw},
  	include: [{model: models.Order}]
  	//대괄호 안에 중괄호 작성
})
//id와 pw를 비교하여 해당하는 user정보와 관계있는 order정보를 join하여 가져오는 중
//설정된 관계에 의거하여 innerjoin이 수행된다

특정 속성만 검색하는 법 Attribute

attributes: ["속성이름", "속성이름"]
//대괄호로 작성해야 한다는점 주의

특정 속성으로 정렬하는 법 Order

order: [["속성이름", "정렬ASC or DESC"]]
//대괄호 두 개 작성

Relationship

- 테이블 간 참조를 통해 관계가 연결되도록 설정할 수 있다
- 1:1, 1:N, M:N의 관계가 있다
- 외래키 설정은 model의 index.js에 설정하였다

1:1관계

- PK쪽: hasOne(FK쪽, {foreignKey:"이름"})
- FK쪽: belongsTo(PK쪽, {foreignKey:"이름"})
- onUpdate, onDelete등의 cascade 옵션 추가 가능

PlayerModel.hasOne(ProfileModel, {
  foreignKey: "player_id",
  onUpdate: "CASCADE",
  onDelete: "CASCADE",
});
ProfileModel.belongsTo(PlayerModel, {
  foreignKey: "player_id",
  onUpdate: "CASCADE",
  onDelete: "CASCADE",
});
//Player테이블에 이미 정의된 기본키 player_id를 Profile테이블에서
//외래키로 참고하고 있다

1:N관계

- PK쪽: hasMany(FK쪽, {foreignKey:"이름"})
- FK쪽: belongsTo(PK쪽, {foreignKey:"이름"})
- 고객과 주문테이블과 같은 관계
- 외래키 이름 변경하는 법
(1) 기본키에서 sourceKey: "Pk이름", foreignKey: "바꿀이름"
(2) 외래키에서 target: "참조하는PK이름", foreignKey: "바꿀이름"
(3) DESC해보면 PK쪽 테이블은 원래이름인 team_id, FK쪽 테이블은 teamid로 이름이 설정되어 있다

TeamModel.hasMany(PlayerModel, {
  //외래키 이름을 다르게 적을 경우 자동으로 기본키를 외래키로 가져간다
  //그래도 sourceKey명시해야한다
  sourceKey: "team_id",
  foreignKey: "teamid",
});
PlayerModel.belongsTo(TeamModel, {
  target: "team_id",
  foreignKey: "teamid",
});

M:N관계

- 두 테이블의 기본키를 참조하는 중간 테이블이 필요하다
- belongsToMany(참조테이블,{through: 중간테이블, foreignKey: "내기본키"})

GameModel.belongsToMany(TeamModel, {
  through: TeamGameModel,
  foreignKey: "game_id",
});
TeamModel.belongsToMany(GameModel, {
  through: TeamGameModel,
  foreignKey: "team_id",
});
//game_id와 team_id를 외래키로 참조하는 테이블 TeamGame을 생성하고 
//위와 같이 설정해준다

참고) TeamGame 테이블 구조

- 생성된 관계를 이용하여 Join을 통해 다양한 정보를 검색할 수 있다

REST Client

- VS code의 확장프로그램으로 View를 생성하지 않아도 곧바로 server전송 결과를 확인할 수 있다
- 임의의 http파일을 생성하여 이용한다
- 사용법
(1) 메소드 url주소 형식으로 입력하면 send request가 활성화되어 클릭시 사용할 수 있다
(2) app.js실행 후 사용해야한다
(3) @변수명=초기화 형태로 변수를 사용할 수 있다. 변수 표기 형태 -> {{server}}
(4) POST, PATCH 요청시 헤더를 작성해야한다 Content-Type: application/json; charset=UTF-8
(5) Json데이터 형식으로 req.body데이터를 전송할 수 있다
- 예시코드)
PATCH로 Json데이터와 Params를 받아 데이터 업데이트

//server주소와 playerId params는 상단에서 변수로 임의의값이 지정된 상태
PATCH {{server}}/players/{{playerId}}/team
Content-Type: application/json; charset=UTF-8
//body데이터, 헤더와 한줄 띄어야 오류발생안함
{
    "teamid": 3
}

http파일코드

try {
  const { playerId } = req.params;
  const { teamid } = req.body;
	//객체 분해 할당
  const updatedPlayer = await models.Player.update(
    {
      //이름과 입력값이름이 같으므로 생략
      teamid,
    },
    {
      where: { player_id: playerId },
    }
  );
  console.log(updatedPlayer);
  //json, send 어떤 방식이든 무방
  res.json(updatedPlayer);
} catch (err) {
  //오류발생시 작동
  console.log(err);
  res.status(500).send("server error");
}

Cmain코드

profile
초보개발자

0개의 댓글