바르고 뜨겁게

[nodeJS] 시퀄라이즈(sequelize) 본문

자바스크립트/Node Js

[nodeJS] 시퀄라이즈(sequelize)

RightHot 2019. 1. 21. 21:44

시퀄라이즈(sequelize)

SQL문법 대신 JavaScript로 대체할 수 있는 ORM

npm i sequelize mysql2

// 시퀄라이즈는 명령프롬프트에서 바로 사용하는 방식(커맨드라인인터페이스)을 지원함
npm i -g sequelize-cli

// 시퀄라이즈 환경 초기화
sequelize init

데이터베이스 스키마 생성

sequelize db:create

  • models/index.js 시퀄라이즈의 메인 파일

  • models/ 아래 자바스크립트들은 테이블과 1:1 대응된다

  • config/config.json 시퀄라이즈 설정 파일


시퀄라이즈로 데이터베이스 만들기

시퀄라이즈 설정

config/config.json

{
"development": {
  "username": "root",
  "password": "1234",
  "database": "nodetestdb",
  "host": "127.0.0.1",
  "dialect": "mysql",
  "operatorsAliases: ": false
},
"test": {
  "username": "root",
  "password": null,
  "database": "database_test",
  "host": "127.0.0.1",
  "dialect": "mysql"
},
"production": {
  "username": "root",
  "password": null,
  "database": "database_production",
  "host": "127.0.0.1",
  "dialect": "mysql"
}
}

models/ 아래 자바스크립트들은 테이블과 1:1 대응된다

  • 테이블 생성

    models/user.js

    module.exports = (sequelize, DataTypes) => {
       return sequelize.define('user', {
      });
    };

    models/index.js

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

    // [user.js]의 module.exports = (sequelize, DataTypes) 매개변수랑 이어진다.
    db.User = require('./user')(sequelize, Sequelize);

  • 테이블 정의

    models/user.js

    module.exports = (sequelize, DataTypes) => {
       return sequelize.define('user', {
           name: {
               type:DataTypes.STRING(20),  // 자료형
               allowNull: false,   // 널허용 여부
               unique: true,   // 프라이머리키

          },
           age:{
               type: DataTypes.INTEGER.UNSIGNED,   // 절대값
               allowNull: false,
          },
           married: {
               type: DataTypes.BOOLEAN,
               allowNull: false,
          },
           comment: {
               type: DataTypes.TEXT,
               allowNull: true,
          },
           created_at: {
               type: DataTypes.DATE,
               allowNull: false,
               defaultValue: sequelize.literal('now()'),
          }
      }, {
           timestamps: false, // 타임스탬프 사용여부
           underscored: true, // snake case(true) / camle case(false) 권장 여부
           paranoid: true, // 삭제일
      });
    };

    models/comment.js

    module.exports = (sequelize, DataTypes) => {
       return sequelize.define('comment.js', {      

           /// 관계가 있을땐 컬럼을 적지 않고
           /// index.js 에서 관계를 적어준다

           // commenter:{
           //     type : DataTypes.STRING(20),
           //     allowNull: false,
           //     unique: true,
           // },
           comment: {
               type: DataTypes.STRING(100),
               allowNull: false,
          },
           create_at:{
               type: DataTypes.DATE,
               allowNull: false,
               defaultValue: sequelize.literal('now()')

          }
      },{
           timestamps: false, // 타임스탬프 사용여부
           underscored: true, // snake case(true) / camle case(false) 권장 여부
      });
    };

    models/index.js

    const path = require('path');
    const Sequelize = require('sequelize');

    const env = process.env.NODE_ENV || 'development'
    const config = require('../config/config.json')[env]; // config.json의 development 부분을 불러온다

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

    const db = {};

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

    db.User = require('./user')(sequelize, Sequelize);
    db.Comment = require('./comment')(sequelize, Sequelize);

    // 관계 형성 , commenter 컬럼 , 참조키
    db.User.hasMany(db.Comment, { foreignKey: 'commenter' , sourceKey: 'id'});
    db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id'});

    module.exports = db;

    app.js 랑 연결

    서버가 시작할때 테이블이 만들어진다.

    var { sequelize } = require('../models');
    sequelize.sync();


Comments