sequelize

broccoli·2021년 4월 23일
0

sequelize

목록 보기
1/7
post-thumbnail

시퀄라이즈는 프로미스 기반의 node.js ORM이다. Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server를 지원한다.

ℹ️ ORM: Object-relation mapping : 객체와 관계형DB의 데이터를 매핑해주는것

1. 설치

mysql과 매핑하는 것을 예로 함.

# mysql2 : mysql과 연결을 위해 필요한 패키지
# sequelize-cli: commandline for sequelize
# sequelize: RDB와 매핑되도록 해주는 ORM 패키지
npm i sequelize sequelize-cli mysql2

2. 초기세팅

2-1. sequelize init

# sequelize 명령어 확인
npx sequelize -h

# initialize for project
npx sequelize init

2-2. config 구성

처음 npx sequelize init을 하면 config폴더와 config.json이 생성되는데, config.js로 변경후 dotenv와 함께 연결스트링에 필요한 정보를 구현한다.
아래는 예시

//config.js 예
require('dotenv').config()

module.exports = {
  development: {
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB,
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mysql'
  },
  test: {
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB,
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mysql'
  },
  production: {
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB,
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mysql',
    logging: false //터미널을 통해 쿼리가 로깅되는 것을 막는다.
  }
}

2-3. models

// index.js
const env = process.env.NODE_ENV || 'development'
const Sequelize = require('sequelize')
const post = require('./post')
const image = require('./image')
const user = require('./user')
const userdetails = require('./userdetails')
const series = require('./series')
const config = require('../config/config')[env]

const db = {}

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

db.Post = post
db.User = user
db.Image = image
db.Series = series
db.UserDetail = userdetails

Object.keys(db).forEach((modelName) => {
  db[modelName].init(sequelize)
})

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db

2-4. model 한가지 예

const DataTypes = require('sequelize')

const { Model } = DataTypes

module.exports = class Post extends Model {
  static init(sequelize) {
    return super.init(
      {
        title: {
          type: DataTypes.STRING(100),
          allowNull: true
        },
        content: {
          type: DataTypes.TEXT,
          allowNull: true
        },
        postKey: {
          type: DataTypes.STRING(100),
          allowNull: false,
          unique: true
        },
        markdown: {
          type: DataTypes.TEXT,
          allowNull: true
        },
        isTemp: {
          type: DataTypes.BOOLEAN,
          allowNull: false,
          defaultValue: false
        },
        tempTitle: {
          type: DataTypes.STRING(100),
          allowNull: true
        },
        tempContent: {
          type: DataTypes.TEXT,
          allowNull: true
        },
        tempMarkdown: {
          type: DataTypes.TEXT,
          allowNull: true
        },
        isUse: {
          type: DataTypes.BOOLEAN,
          allowNull: false,
          defaultValue: true
        },
        isDeleted: {
          type: DataTypes.BOOLEAN,
          allowNull: false,
          defaultValue: false
        },
        scope: {
          type: DataTypes.STRING(1),
          allowNull: false,
          defaultValue: 'A'
        },
        summary: {
          type: DataTypes.STRING(150),
          allowNull: true
        },
        series: {
          type: DataTypes.STRING(20),
          allowNull: true
        },
        thumbnail: {
          type: DataTypes.STRING(200),
          allowNull: true
        }
      },
      {
        modelName: 'Post',
        tableName: 'posts',
        charset: 'utf8mb4',
        collate: 'utf8mb4_general_ci',
        sequelize
      }
    )
  }

  static associate(db) {
    db.Post.belongsTo(db.User, {
      onUpdate: 'CASCADE',
      onDelete: 'CASCADE',
      foreignKey: 'userId',
      targetKey: 'id'
    })
    db.Post.hasMany(db.Image, {
      foreignKey: 'postId',
      sourceKey: 'id'
    })
    db.Post.belongsToMany(db.User, {
      as: 'Liker',
      through: 'likes'
    })
  }
}

2-5. app.js

// app.js
...
const db = require('./models')
db.sequelize
  .sync()
  .then(() => {
    console.log('✅ db connected')
  })
  .catch((e) => {
    console.error(e)
  })

참조링크

profile
🌃브로콜리한 개발자🌟

0개의 댓글