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 의 약자로 객체지향 언어에서 관계형 데이터베이스에 접근이 가능하도록 도와주는 중간다리의 역할
npm install --save sequelize
You will need the Sequelize Command-Line Interface (CLI)
The CLI ships support for migrations and project bootstrapping.
Command-Line Interface (CLI)
필요equelize - cli 가 마이그레이션을 할 수 있도록 돕는 툴로,
CLI에서 모델을 생성해주거나 스키마 적용을 할 수 있도록 돕는다
npm install --save-dev sequelize-cli
npm i sequelize sequelize-cli
npx sequelize-cli init
config: CLI에게 어떻게 데이터베이스와 연결할 지 알려주는 config file을 가진 폴더
models: 프로젝트에 쓰일 모든 model을 가진 폴더
migrations: 모든 migration file을 가진 폴더
seeders: 모든 seed file을 가진 폴더
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
에서 데이터베이스의 이름과 비밀번호를 변경해준다
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:
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 }
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.
npx sequelize-cli db:migrate
마이그레이션은 스키마가 변경될때 마다 실행해줘야 한다