[DB] Sequelize CRUD와 관계 설정

CRUD

1. CREATE

User.create({
  name: '까까',
  age: 7,
  gender: 'male'
});
  • models에서 불러온 모델을 바탕으로 create 메소드 사용
  • Sequelize : id, createdAt, updatedAt 필드는 자동으로 생성

2. READ

1) findAll

User.findAll({
  attributes: ['name', 'age']
})

User.findAll({
  attributes: ['name', 'age'],
  where: {
    gender: 'male'
  }
})

User.findAll()
// SELECT * FROM Users
  • 모델은 단수형으로 생성
    *테이블은 복수형으로 자동 생성

2) findOne

User.findOne({ where: { name: '까까' } })

3) findByPk

User.findByPk(1)
  • Pk를 이용하여 조회

4) findOrCreate

const [user, created] = User.findOrCreate({
  where: { name: '까까' },
  defaults: {
    gender: 'male'
  }
})
  • 만약 존재한다면 해당하는 인스턴스를 반환하고, 그렇지 않으면 새로 생성
  • created : 새 객체가 생성되었을 경우 true, 그렇지 않을 경우 false
  • where에 함께 전달되는 defaults 옵션은 검색 결과가 존재하지 않을 경우 새로 생성되는 요소가 갖는 기본값

3. UPDATE

User.UPDATE({age: 8}, {
  where: {
    name: '까까'
  }
})

const result = User.findByPk(1)
result.UPDATE({
  age: result.age + 1
})

const result = User.findByPk(1)
result.age++
result.save()
  • UPDATE 메소드를 사용하지 않고 변경한 경우 save() 메소드로 저장해 주어야 함

4. DELETE

User.destroy({
  where: {
    name: '까까'
  }
})

관계 정의

1. 관계 설정 방법

1) 1:1

User.hasOne(Profile)
Profile.belongsTo(User)

2) 1:N

Team.hasMany(Player)
Player.belongsTo(Team)

3) N:M

Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});
  • through를 사용해서 중간 테이블을 명시

2. 관계 설정 예시 (1:N)

예시 : users 테이블과 urls 테이블을 1:N 관계로 설정하기

  • urls 테이블에 userId 필드 생성
  • userId는 users 테이블의 id를 Fk로 가져옴

1) column을 추가하는 migration 생성

// add-userId-column-to-url migration 생성
module.exports = {
  up: async (queryInterface, Sequelize) => {
    // 1. Column 생성 : addColumn 메소드 사용
    await queryInterface.addColumn("urls", "userId", Sequelize.INTEGER);
    // 2. Fk 제약 조건 설정
    await queryInterface.addConstraint("urls", {
      fields: ["userId"],
      type: "foreign key",
      name: "USERID_IS_FOREIGN_KEY",
      references: {
        table: "users",
        field: "id",
      },
      onDelete: "cascade",
      onUpdate: "cascade",
      // cascade : 부모테이블 primary 값이 수정 또는 삭제될 경우 해당 값도 수정 또는 삭제
    });
  },

  down: async (queryInterface, Sequelize) => {
    // 1. Fk 제약 조건 삭제
    await queryInterface.removeConstraint("urls", "USERID_IS_FOREIGN_KEY");
    // 2. Column 삭제
    await queryInterface.removeColumn("urls", "userId");
  },
};

2) 1:N의 관계 지정

(1) 각각의 model에 지정

// url.js
class url extends Model {
  static associate(models) {
    models.url.belongsTo(models.user);
  }
}
// user.js
class user extends Model {
  static associate(models) {
    models.user.hasMany(models.url);
  }
}

(2) index.js에서 한번에 지정

// index.js
url.belongsTo(user);
user.hasMany(url);

References

1. 공식문서
2. 관계 정의하기

좋은 웹페이지 즐겨찾기