Node.js

시퀄라이저 모델 자료형

쿠와와 2020. 12. 29. 15:38

 테이블에 대응되는 시퀄라이즈 모델 생성

 

const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      // 아이디는 자동으로 생성해주기 때문에 생략 가능
      name: {
        type: Sequelize.STRING(20),
        allowNull: false,
        unique: true,		// 고유하게 만들어줌
      },
      age: {
        type: Sequelize.INTEGER.UNSIGNED,
        allowNull: false,
      },
      married: {
        type: Sequelize.BOOLEAN,		// SQL에서는 TINYINT
        allowNull: false,
      },
      comment: {
        type: Sequelize.TEXT,
        allowNull: true,
      },
      created_at: {
        type: Sequelize.DATE,			// SQL에서는 DATETIME, DateOnly사용하면 date만
        allowNull: false,
        defaultValue: Sequelize.NOW,
      },
    }, {
      sequelize,
      timestamps: false,		// 원래는 True -> createAt, updateAt 제공해줌
      underscored: false,		// createAt or create_at 둘중에 하나 선택 
      modelName: 'User',		// js에서 사용하는 이름 
      tableName: 'users',		// sql에서 사용하는 이름
      paranoid: false,			// deleteAt 복구하기 위해서
      charset: 'utf8',
      collate: 'utf8_general_ci',
    });
  }
	// 밑에 모델 관계 설명에 대한 코드 
  static associate(db) {
    db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
  }
};

시퀄라이즈 모델의 자료형은 MySQL의 자료형과 조금 다름

define 메서드의 세 번째 인자는 테이블 옵션

  • timestamps: truecreatedAt(생성 시간), updatedAt(수정 시간) 컬럼을 자동으로 만듦
  • 예제에서는 직접 created_at 컬럼을 만들었으므로 false로 함
  • paranoid 옵션은 truedeletedAt(삭제 시간) 컬럼을 만듦, 로우 복구를 위해 완전히 삭제하지 않고 deletedAt표시해둠
  • underscored 옵션은 캐멀케이스로 생성되는 컬럼을 스네이크케이스로 생성
  • modelName은 모델 이름, tableName 옵션은 테이블 이름을 설정
  • charsetcollate는 한글 설정을 위해 필요(이모티콘 넣으려면 utf8mb4)

users 모델comments 모델 간의 관계를 정의

  • 1:N 관계 (사용자 한 명이 댓글 여러 개 작성)
  • 시퀄라이즈에서는 1:N 관계를 hasMany로 표현(사용자.hasMany(댓글))
  • 반대의 입장에서는 belongsTo(댓글.belongsTo(사용자))
  • belongsTo가 있는 테이블에 컬럼이 생김(댓글 테이블에 commenter 컬럼)

const Sequelize = require('sequelize');

module.exports = class Comment extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      comment: {
        type: Sequelize.STRING(100),
        allowNull: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: true,
        defaultValue: Sequelize.NOW,
      },
    }, {
      sequelize,
      timestamps: false,
      modelName: 'Comment',
      tableName: 'comments',
      paranoid: false,
      charset: 'utf8mb4',
      collate: 'utf8mb4_general_ci',
    });
  }
	/// 이부분을 보면 됨 
  static associate(db) {
    db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id' });
  }
};