RDBMS(Relational DBMS)라고 부르는 관계형 DBMS 중 하나로 가장 많이 쓰인다.
Sequelize는 ORM(Object-relational Mapping)으로 분류된다. ORM은 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구이다. 시퀄라이즈를 사용하면 SQL를 사용하지 않고도 자바스크립트로 MYSQL 조작이 가능하다.
express 프로젝트 설치 후 sequelize를 설치합니다.
$ npm i sequelize mysql2
$ npm i -g sequelize-cli
$ sequelize init
시퀄라이즈에 필요한 sequelize, mysql2 패키지와 sequelize-cli 패키지를 (전역)설치해줍니다. 설치 완료 후 sequelize init
명령어로 호출합니다.
명령어 호출 뒤 생성된 폴더 중 modle/index.js 파일을 수정해줍니다.
const path = require('path');
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
... app.js
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const sequelize = require('./models/index').sequelize;
const app = express();
sequelize.sync(); // 서버 실행 시 MySQL 연동
...
MySQL의 테이블은 시퀄라이즈 모델과 대응된다. 시퀄라이즈는 모델과 MySQL의 테이블을 연동하는 역할을 합니다.
시퀄라이즈는 자동으로 ID를 기본 키로 연결합니다.
user 모델 작성
module.exports = (sequelize, DataTypes) => {
return sequelize.define('user', {
name: {
type: DataTypes.STRING(20), // VARCHAR
allowNULL: false,
unique: true,
},
age: {
type: DataTypes.INTEGER.UNSIGNED,
allowNULL: false,
},
married: {
type: DataTypes.BOOLEAN, // TINYINT
allowNULL: false,
},
comment: {
type: DataTypes.TEXT,
allowNULL: true,
},
created_at: {
type: DataTypes.DATE,
allowNULL: false,
defaultValue: DataTypes.NOW,
},
},{
timestamps: false, // ture일 시 시퀄라이저는 createAt, updateAt 컬럼을 추가함.
})
}
conmment 모델도 생성한 뒤 model/index.js에 연결합니다.
db.User = require('./user')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);
마지막으로 config/config.json 파일을 수정합니다. MySQL의 비밀번호와 DB를 설정해줍니다.
"development": {
"username": "root",
"password": "[비밀번호]",
"database": "[database name]",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorsAliases": false
},
사용자는 댓글을 여러 개 작성이 가능하고, 댓글은 작성자(사용자)가 한명이므로 1:N 관계입니다.
시퀄라이즈에서는 1:N 관계를 hashMany라는 메서드로 표현합니다.
hashMany (user 테이블의 로우 하나를 불러오면 연결된 connect 테이블의 로우들도 같이 불러옴)
-------->
user comment
<--------
belongsTo
model/index.js 에서 코드 추가
db.User = require('./user')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);
db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id'});
시퀄라이즈는 방금 정의한 대로 테이블 간의 관계를 파악하여 commenter 컬림을 추가하고 외래키도 추가합니다. 외래키 컬럼은 commenter고, user의 id 컬럼을 가리킵니다.
npm start
서버를 실행
일대일 이므로 hasOne, belongsTo가 반대여도 상관없음.
hasOne
-------->
user comment
<--------
belongsTo
시퀄라이즈에서 N:M 관게를 표현하기 위해 belongsToMany 메서드가 있습니다.
INSERT INTO users (name, age, married, comment) VALUES ('zero, 24, 0, '소개1');
// 시퀄라이즈 쿼리문
const { User } = require('../models');
User.create({
name: 'zero',
age: 24,
married: false,
comment: '소개1',
});
데이터를 넣을 때는 시퀄라이즈 모델에 정의한 자료형대로 넣어야합니다.
SELECT * FROM users;
User.findAll({}); // 모든 데이터 조회
SELECT * FROM users LIMIT 1;
User.findOne({}); // 하나의 데이터만 조회
SELECT name, married, FROM users;
User.findAll({
attribute: ['name', 'married'], // 원하는 컴럼만 조회
});
SELECT name, age FROM users WHERE married = 1 AND age > 30;
const { User , Sequelize: { Op} } = require('../models');
User.findAll({
attributes: ['name', 'age'],
where: {
married: 1,
age: { [Op.gt]: 30},
},
});
Op.gt(초과), Op.gte(이상), Op.lt(미만), Op.lie(이하), Op.ne(같지 않음), Op.or(또는), Op.in(배열 요소 중 하나), Op.notIn(배열 요소와 모두 다름) 등...
SELECT id, name FROM users ORDER BY age DESC;
User.findAll({
attributes: ['id', 'name'],
order: [['age', 'DESC']],
});
UPDATE FROM users WHERE id = 2;
User.update({
comment: '수정 내용',
},{
where: { id: 2 },
});
``
* 로우 삭제
DELETE FROM users WHERE id = 2;
User.destory({
where: { id: 2 },
});