sequelize 활용(migration, associate)

HARIBO·2021년 11월 18일
1

sequelize-cli를 이용해 테이블에 필드 추가하기

  • migration을 이용했다.
  • npx sequelize-cli migration:generate --name <마이크레이션 파일 이름> 명령어로 마이크레이션 파일을 생성한다. (npx sequelize-cli model:generate 명령어는 model, migration용 파일 2개를 만들어 준다. 모델 생성 시 단수형으로 생성하면, 마이그레이션 파일에서 복수형 테이블명을 사용한다.
  • urls라는 테이블에 user_id라는 칼럼을 만들고, user라는 테이블의 id 칼럼(PK)을 참조해 FK를 만들었다. 또, onDelete: "CASCADE"라는 속성을 주어서 PK가 삭제될 경우 FK레코드가 제거되도록 설정했다.
//migrations/20211118024449-urls_edit.js

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.addColumn(
      "urls", //테이블명
      "user_id", //필드명
      {
        type: Sequelize.INTEGER,
        references: {model: "users", key: "id"}, //FK설정
        onDelete: "CASCADE" //PK가 삭제되면 FK도 삭제됨
      }
    )
  },

  down: async (queryInterface, Sequelize) => {
    //마이그래이션 롤백
    await queryInterface.removeColumn("urls", "user_id");
  }
};

제약이 추가되었다.

urls테이블에 레코드를 넣고(맨 오른쪽 필드가 FK다)

users테이블의 레코드를 삭제하면(PK 삭제)

urls테이블의 레코드도 삭제된다.

model에서 설정

  • users 테이블과 urls테이블은 1:N관계
  • sequelize공식 문서에 따르면, 연관이 있는 테이블은 쌍으로 관계를 정의해 주어야 한다
//models/url.js 중 일부
//models는 db객체이다
static associate(models) {
      models.url.belongsTo(models.users, {
        foreignKey: "user_id",
        onDelete: "cascade" //PK가 삭제되면 FK도 같이 삭제된다
      })
    }

//models/users.js 중 일부
static associate(models) {
	models.users.hasMany(models.url)
}

출처
여러 가지 외래 키 설정 방법
https://stackoverflow.com/questions/29904939/writing-migrations-with-foreign-keys-using-sequelizejs

0개의 댓글