10월 18일 (월) Sequelize

남이섬·2021년 10월 18일
0

Sequelize

Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server. It features solid transaction support, relations, eager and lazy loading, read replication and more.

Promise 기반의 Node.js ORM 으로서 우리가 사용하는
MySQL 을 위한 프로그램이다

ORM은 Object Relational Mapping 의 약자로 객체지향 언어에서 관계형 데이터베이스에 접근이 가능하도록 도와주는 중간다리의 역할

Installing

npm install --save sequelize

Migrations

  • Git과 같은 버전 제어 시스템을 사용하여 소스 코드의 변경 사항을 관리하는 것처럼 마이그레이션을 사용하여 데이터베이스에 대한 변경 사항을 추적할 수 있다
  • 마이그레이션을 통해 기존 데이터베이스를 다른 상태로 전송할 수 있으며, 그 반대의 경우도 마찬가지다
  • 이러한 상태 전환은 마이그레이션 파일에 저장되며, 마이그레이션 파일은 새 상태로 전환하는 방법과 이전 상태로 돌아가기 위한 변경 사항을 되돌리는 방법이 있다

You will need the Sequelize Command-Line Interface (CLI) The CLI ships support for migrations and project bootstrapping.

  • Command-Line Interface (CLI) 필요

Installing the CLI

equelize - cli 가 마이그레이션을 할 수 있도록 돕는 툴로,
CLI에서 모델을 생성해주거나 스키마 적용을 할 수 있도록 돕는다

npm install --save-dev sequelize-cli

npm i sequelize sequelize-cli

Project bootstrapping

npx sequelize-cli init

  • config: CLI에게 어떻게 데이터베이스와 연결할 지 알려주는 config file을 가진 폴더

  • models: 프로젝트에 쓰일 모든 model을 가진 폴더

  • migrations: 모든 migration file을 가진 폴더

  • seeders: 모든 seed file을 가진 폴더

Configuration

CLI 와 데이터베이스의 연결을 위해 필요한 파일, config폴더에 있는 config.json 파일의 내용은 하기와 같다

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "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"
  }
}

총 세개의 데이터베이스가 존재하며 각각 개발, 테스트, 배포용 이라는 의미를 가지고 있다
기본적으로 development 즉, 개발용 데이터베이스를 쓰고있는데 그 이유는 models 폴더의 index.js 파일 내용에 기본값으로 'development' 를 가지고 있다

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
...

config.json에서 데이터베이스의 이름과 비밀번호를 변경해준다

Creating the first Model (and Migration)

Once you have properly configured CLI config file you are ready to create your first migration. It's as simple as executing a simple command.

We will use model:generate command. This command requires two options:

  • name: the name of the model;
  • attributes: the list of model attributes.
    Let's create a model named User.
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

npx sequelize-cli model:generate
--name<모델 이름>
--attributes <필드이름>:<타입>

id, createdAt, updatedAt 필드는 자동생성 된다

명령어에 모델이름과 필요한 필드와 타입을 기재후 터미널에 입력하면
migrations와 models폴더에 파일이 생성된다

migrations > 생성날짜.파일

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('urls', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      url: {
        type: Sequelize.STRING
      },
      title: {
        type: Sequelize.STRING
      },
      visits: {
        type: Sequelize.INTEGER
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('urls');
  }
};

models > url.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class url extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  };
  url.init({
    url: DataTypes.STRING,
    title: DataTypes.STRING,
    visits: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    }
  }, {
    sequelize,
    modelName: 'url',
  });
  return url;
};

초기값 설정

defaultValue: <설정값>

visits: {
  type: DataTypes.INTEGER,
  defaultValue: 0
}

Running Migrations

Until this step, we haven't inserted anything into the database. We have just created required model and migration files for our first model User. Now to actually create that table in database you need to run db:migrate command.

  • Will ensure a table called SequelizeMeta in database. This table is used to record which migrations have run on the current database
  • Start looking for any migration files which haven't run yet. This is possible by checking SequelizeMeta table. In this case it will run XXXXXXXXXXXXXX-create-user.js migration, which we created in last step.
  • Creates a table called Users with all columns as specified in its migration file.

npx sequelize-cli db:migrate

마이그레이션은 스키마가 변경될때 마다 실행해줘야 한다

profile
즐겁게 살자

0개의 댓글