sequelize 사용하기3 - 외래키 적용된 테이블 만들기

codeing999·2022년 8월 12일
5

Sequelize 사용 일지

목록 보기
3/10

sequelize 명령어들 다시 정리

설치

npm i sequelize mysql2 -S
npm i sequelize-cli -D

models, migrations, seeders, config 폴더 생성

npx sequelize init

DB와 연결

config/config.json 파일에 DB 정보 작성 후

npx sequelize db:create

를 치면 해당 저장소?에 데이터베이스 생긴다.

migration과 model 생성

npx sequelize model:generate --name User --attributes email:string,nickname:string,password:string

이런 식으로 치면 테이블을 생성하는 migration파일과 테이블 관련 정보를 작성하는 model 파일이 생긴다.
이 때, 자동으로 되는 것들이 있는데 이걸 주의해야한다.

migration을 보면 table이름은 대문자로 시작하고 s가 붙어있다. 이걸 그냥 수정하면 에러가 난다.

tableName : 'comment',
이걸 해당하는 model에 작성해주면 일단은 괜찮아지는데 무슨 다른 오류가 나올지 알 수 없다.

id라는 이름으로 프라이머리키를 자동으로 생성한다. 필요에 따라 userId 등으로 적당히 고쳐 사용하면 된다.

createdAt과 updatedAt 속성은 저절로 추가된다. 즉 명령어칠 때 이건 빼고해도되고, 안쓰고 싶다면 지워야 한다.

위 명령어의 다른 예시들

npx sequelize model:generate --name note --attributes noteid:integer,userid:integer,title:string,content:string,createdat:date,like:integer
npx sequelize model:generate --name comment --attributes commentid:integer,userid:integer,noteid:integer,content:string,createdat:date
npx sequelize model:generate --name user --attributes userid:integer,nickname:string,password:string

이건 초기에 썼던 것으로 여기서 각각의 primary key와 createdat은 빼도 된다. 자동으로 생겨서 중복만 된다.

migration 수정

필드의 제한사항을 추가로 작성하는 것 외에는 안건드는게 좋다.

allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
type: Sequelize.STRING,
type: Sequelize.DATE,
unique: true,

이런 것들 중에 골라서 적으면 된다.
아무튼 migration은 테이블 생성하는 것들만 만들고 이 제한사항만 넣어주고 안건드는게 좋을 듯 하다.
autoIncrement는 migration에만 작성하면 적용이 안되는 걸 발견했다. models에도 써주니까 적용이 됐다.(models에만 적어도 되는지는 모르겠다.) 혹시 모르니 왠만하면 models에도 다 적는게 좋을 듯 하다.

model 수정

여기서부터는 더 아래 글을 보면 된다. 이것까지 완료가 되면

실제 테이블 생성

npx sequelize db:migrate

이걸 치면 migration으로 생성하도록한 테이블정보에 model에 적은 것들이 추가로 덧붙여져서 테이블 쿼리가 만들어져서 테이블이 생성된다.
워크벤치로 외래키 확인해보면 외래키도 작성되어 있다.

기타

특정 이름으로 migration 직접 생성

npx sequelize migration:create --name 이름

마이그래이션 실행 취소

npx sequelize db:migrate:undo
한번 칠때마다 마지막에 한것부터 하나씩 취소된다. table작성하는 migration만 작성해두고 원하는 대로 작성 안되면 이걸로 돌려서 수정한 후 다시 실행해야 한다. 왜냐하면 undo로 취소하지 않은 마이그래이션은 내용을 수정했다고 해도 다시 실행을 안한다.

sequelize로 외래키 적용된 테이블 만들기

models/index.js는 전혀 고칠 필요가 없다.

  1. 각 테이블들을 생성하는 migration을 작성한다. migration에는 foreign key 컬럼이 포함되어야 한다.

  2. models 작성할 때는 foreign key에 해당하는 속성들은 빼고 작성한다.

  3. models에 테이블 간의 1:N, N:1 관계 및 foreign key 작성.
    .init은 원래 있는 거고 그 밑에 .associate부터 새로 작성하는 부분.

Post.init(
    {
      postId: {
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      imageUrl: DataTypes.STRING,
      text: DataTypes.STRING,
    },
    {
      sequelize,
      modelName: "Post",
    }
  );
  Post.associate = function (models) {
    Post.belongsTo(models.User, {
      foreignKey: "userId",
      targetKey: "userId",
      onUpdate: "cascade",
      onDelete: "cascade",
    });
    Post.hasMany(models.Comment, {
      foreignKey: "postId",
      sourceKey: "postId",
      onUpdate: "cascade",
      onDelete: "cascade",
    });
  };

현재 모델이 N이면 belongsTo 호출한 후 targetKey를 쓰고 1인 모델의 primary key 대입.
현재 모델이 1이면 hasMany 호출한 후 sourceKey를 쓰고 자신의 primary key를 대입.

참고자료

https://c3epmos.tistory.com/59

profile
코딩 공부 ing..

0개의 댓글