Node/시퀄라이즈(MySQL), 몽구스(MongoDB)

모델 만들기

webmaster 2022. 9. 18. 21:29
728x90

Model을 만드는 방법

  1. SQL직접 적용(mysql에 접속)
  2. 워크벤치 툴을 사용
  3.  model 파일을 사용

시퀄라이즈에서는 자료형을 표현하는 방식에서 조금 차이가 있다.

models/user.js

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,
          allowNull: false
        },
        comment: {
          type: Sequelize.TEXT,
          allowNull: true
        },
        created_at: {
          type: Sequelize.DATE,
          allowNull: false,
          defaultValue: Sequelize.NOW
        }
      },
      {
        //모델에 대한 설정
        sequelize,
        timestamps: false, //timestamps 가 true 일 경우, createAt, updatedAt이 생긴다
        underscored: false, //스네이크케이스를 사용할지 말지 여부(false면 사용 안한다), 직접만드는 것은 적용이 안된다
        modelName: "User", //모델이름
        tableName: "users", //테이블명
        paranoid: true, //제거한 날짜가 추가된다, deletedAt -> 실제 제거된것은 아니다
        charset: "utf8mb4",
        collate: "utf8_general_ci"
      }
    );
  }

  static associate(db) {
    db.User.hasMany(db.Comment, { foreignKey: "commenter", sourceKey: "id" });
  }
};

models/comments.js

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',
    });
  }

};

models/index.js

const Sequelize = require("sequelize");
const User = require("./user");
const Comment = require("./comment");

const env = process.env.NODE_ENV || "development";
const config = require("../config/config")[env];
const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

db.User = User;
db.Comment = Comment;

User.init(sequelize);
Comment.init(sequelize);

User.associate(db);
Comment.associate(db);

module.exports = db;
  • init으로 sequelize와 연결한다
  • associate로 관계 설정한다

시퀄라이즈 모델 옵션 

MySQL 테이블 옵션 VS 시퀄라이즈 옵션

  • 시퀄라이즈 모델의 자료형은 MySQL의 자료형과 조금 다르다
  • define 메서드의 세 번째 인자는 테이블 옵션
    • timestamps: true면 createdAt(생성 시간), updatedAt(수정 시간) 컬럼을 자동으로 만든다
    • 예제에서는 직접 created_at 컬럼을 만들었으므로 false로 한다
    • paranoid 옵션은 true면 deletedAt(삭제 시간) 컬럼을 만듦, 로우 복구를 위해 완전히 삭제하지 않고 deletedAt에 표시해둔다
    • underscored 옵션은 캐멀케이스로 생성되는 컬럼을 스네이크케이스로 생성한다
    • modelName은 모델 이름, tableName 옵션은 테이블 이름을 설정한다
    • charset과 collate는 한글 설정을 위해 필요(이모티콘 넣으려면 utf8mb4로)하다.

 

728x90

'Node > 시퀄라이즈(MySQL), 몽구스(MongoDB)' 카테고리의 다른 글

몽구스 ODM  (0) 2022.09.24
관계 쿼리  (0) 2022.09.18
쿼리 알아보기  (0) 2022.09.18
관계 정의하기  (0) 2022.09.18
시퀄라이즈  (0) 2022.09.18