Sequelize
Sequelize란 node.js에서 mysql등 관계형 데이터베이스를 쉽게 다룰수 있게 도와주는 라이브러리이다. Sequelize는 대표적인 node.js의 ORM(Object Relational Mapping)이다.
ORM이란?
간단하게 말해서 ORM은 객체 지향 프로그래밍언어를 관계형 데이터베이스와 연결해주는 패러다임이다.
즉, Sequelize를 사용하면 자바스크립트로 mysql을 제어할 수 있다.
Sequelize 설치
sequelize와 mysql2를 터미널에서 설치한다.
npm install --save sequelize
npm install --save mysql2
sequelize가 전역설치가 안되어 있을 경우 전역설치해준다. sequelize-cli는 터미널에서 sequelize를 더욱 간편하게 조작할수있게 만들어준다.
npm install -g --save-dev sequelize-cli
전역 cmd 에서 sequelize를 초기화해준다. 그러면 config, models, migrations, seeders 폴더가 생성된다.
sequelize init
Sequelize 설정
1) config/config.json
config.json파일에서 DB정보를 각 환경에 맞게 설정할 수 있다. sequelize init을 한 경우 기본값으로 설정이 되어있는 것을 자신의 프로젝트에 맞게 변경하면 된다.
{
"development": {
"username": "root",
"password": null,
"database": "test",
"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부분을 바꿔준다.
username: DB 사용자명
password: DB 사용자 비밀번호
database: 관계형 데이터 베이스에서 사용할 database(schema) 이름
*미리 MySQL에서 schema를 만들어주어야 한다.*
host: host주소
dialect: 사용할 관계형 데이터 베이스 이름
operatorsAliases: 연산자에 대한 별칭 사용여부
즉, config/config.json은 sequelize를 사용하기 위하여 환경을 설정하는 부분이다.
2) models/index.js
- models/index.js파일은 config.json파일의 설정 값을 읽어 sequelize를 생성한다.
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config.json')[env];
const db = {};
let sequelize;
sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.newCustomer = require('./customer')(sequelize, Sequelize);
db.newPurchase = require('./purchase')(sequelize, Sequelize);
db.newCustomer.hasMany(db.newPurchase, { foreignKey: 'customer_id', sourceKey: 'id' });
db.newPurchase.belongsTo(db.newCustomer, { foreignKey: 'customer_id', sourceKey: 'id' });
module.exports = db;
즉, models/index.js는 Model을 정의하고 관계를 설정해주는 역할이다.
3) 확인하기
연결이 잘 되었는지 확인하기 위해서 아래 코드를 자신이 만들 index.js(일반적 네이밍)에 붙여넣고 node index.js를 실행시킨다.
const {sequelize} = require('./models');
const driver = () => {
sequelize.sync()
.then(() => {
console.log("DB연결 성공");
})
.catch((error) => {
console.log("초기화 실패");
console.error(error);
});
};
driver();
DB 연결 성공이 뜨면 정상적이다.
Sequelize Query 사용방법
INSERT
-create(values: Object, options: Object): 레코드 생성함수
-findOrCreate(options: Object): 조회 시 없으면 생성해주는 함수
-findCreateFind(options: Object): 조회 시 없으면 생성 후 조회하는 함수
-upsert(vales: Object, options: Object): 한 레코드만 인서트하거나 업데이트 해주는 함수
SELECT
-findOne(options: Object) : 하나만 조회하는 함수. find()와 동일
-findAll(options: Object) : 여러 개를 조회하는 함수
-findAndCountAll(findOptions: Object) : 조회 후 총 수 조회.
-findByPk(id: Number | String | Buffer, options: Object) : 프라이머리키로 조회하는 함수
-findCreateFind(options: Object) : 조회 시 없으면 생성 후 조회하는 함수
-findOrCreate(options: Object): 조회수 없으면 생성해주는 함수
UPDATE
-update(values: Object, options: Object) : 값을 업데이트 해주는 함수. 여러 레코드 가능
-upsert(values: Object, options: Object) : 한 레코드만 인서트하거나 업데이트해 주는 함수
DELETE
-destroy(options: Object) : 한 개나 여러 레코드를 삭제하는 함수
Sequelize SELECT Query함수의 Option
-attributes : 조회할 칼럼을 정하는 옵션.
-attributes안의 include : table없는 칼럼을 추가할 때 쓰는 옵션.
-where : 조회할 칼럼의 조건문을 정하는 옵션.
-include : foreignKey로 Outer Left Join하는 옵션.
-order : 정렬 옵션.
-limit : 조회하는 레코드의 개수를 정하는 옵션.
-offset : 몇 번째부터 조회할지 정하는 옵션.
User.find({ attributes: ['useremail', 'username' ], where: {id:1, useremail:"admin@admin.com"}});
User.find({include : [model.users], order: 'createdAt desc', limit: 5, offset: 10 });
Sequelize foreignKey Join
// Automagically generated join model
User.belongsToMany(Project, { through: 'UserProjects' });
Project.belongsToMany(User, { through: 'UserProjects' });
Sequelize에서 직접 Query문 사용하기
var query = 'select * form user where name = admin';
sequelize.query(query)
.spread(function (results, metadata) {
// 쿼리 실행 성공
}, function (err) {
// 쿼리 실행 에러
});