Seqeulize 사용하기
seqeulize는 nodejs에서 웹을 데이터베이스에 연동할 때 사용하는 미들웨어이다.
seqeulize는 DB에서 조회 된 값을 객체로 전달해주는 ORM(object-relational mapping)이다.
Seqeulize 사전작업
{
"development": {
"username": "root",
"password": "db비밀번호",
"database": "db이름",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorAliases" : false
}
}
config.json은 DB의 연동에 필요한 정보 (username
, password
, database
, host
, dialect
) 값이 들어있다.
Project/models/index.js
var path = require('path');
var Sequelize = require('sequelize');
var env = process.env.NODE_ENV || 'development';
var config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
var db = {};
var sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = require('./user')(sequelize, Sequelize);
module.exports = db;
index.js는 new Sequelize(config.database, config.username, config.password, config);
config.json에 있는 DB 값으로 새로운 Sequelize객체를 생성하여 var db
객체에 넣어주고 다른 곳에서도 같은 Sequelize객체를 사용하도록 db
을 experts 해주는 것을 볼 수있다.
- models/index.js를 통해서 sequelize와 user를 접근 할수있다.
Project/models/user.js
module.exports = (sequelize, DataTypes) => {
return sequelize.define('user', {
useremail: {
/* column 속성들 */
type: DataTypes.STRING(20),
allowNull: false,
unique: true,
/* 여기까지 */
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
name: {
type: DataTypes.STRING(10),
allowNull: false,
},
},{
timestamps:false,
});
}
user.js는 users이름의 DB table
이 없으면 생성해주고 존재하면 ORM의 객체 모델이 된다.
- 칼럼은
id
프라이머리 키,useremail
,password
,name
가 있다. id
와createdAt
,updatedAt
을 자동 생성해준다.
Sequelize의 DB table 칼럼 속성들
이름 | Type | Attribute | Description |
---|---|---|---|
type | String , DataTypes | 밑에 참고 | |
allowNull | Boolean | default: true | null가능, 불가능 |
defaultValue | any | default: null | 초기 값 |
unique | String , Boolean | default: false | 칼럼에 겹치는 값의 존재 가능 여부 |
primaryKey | Boolean | default: false | |
field | String | default: null | |
autoIncrement | Boolean | default: false | 값을 1씩 증가해서 저장 |
comment | String | default: null | |
references | String , Model | default: null | |
references.model | String , Model | ||
references.key | String | default: ‘id’ | |
onUpdate | String | ||
onDelete | String | ||
get | Function | ||
set | Function |
table 칼럼 type의 Attribute들 “type-db.type
형태”(-뒤가 없는 것은 db와 동일하기 때문)
type | Attribute |
---|---|
text | STRING-VARCHAR(255) , STRING(1234)-VARCHAR(1234) , STRING.BINARY-VARCHAR BINARY ,TEXT, TEXT(‘tiny’)- TINYTEXT |
int | INTEGER, BIGINT, BIGINT(11) |
float | FLOAT, FLOAT(11), FLOAT(11, 12) |
double | DOUBLE, DOUBLE(11), DOUBLE(11, 12) |
boolean | BOOLEAN-TINYINT(1) |
demical | DECIMAL, DECIMAL(10, 2) |
date | DATE-DATETIME , DATE(6)-DATETIME(6) , DATEONLY-DATE |
json | JSON |
Sequelize사용하기, DB사용하기
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var sequelize = require('./models').sequelize;
var app = express();
sequelize.sync();
먼저 var sequelize = require('./models').sequelize;
코드가 sequelize 객체를 만들어 준 것이다.
이후 sequelize.sync();
sync()메소드를 통해 db를 연결해주었다.
javascript는 컴파일러가 아니라 인터프리터이기 때문에 코드 순서가 중요하다.var sequelize = require('./models').sequelize;
는 라우터들 밑에 작성해 주도록 하고sequelize.sync();
는 var app = express(); 밑에 작성해주도록 하자.
잘못된 곳에 호출했을 시 오류가 발생할 수 있다.
Project/views/index.js
var express = require('express');
var router = express.Router();
var {User} = require('../models');
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
기존의 /routes/index.js에서 var {User} = require('../models');
가 추가되었다.
db에 미리 넣어둔 user 테이블의 레코드이다.
이 레코드를 가져와서 화면에 띄어보자.
먼저 /views/index.pug를 조금 수정해주자.
block content
h1= title
p Welcome to #{title}
p User e-mail : #{useremail}
block content 부분에 p태그로 User e-mail을 화면에 보이도록 만들었다.
다시 라우터로 가서 DB에서 레코드를 가져오자.
Project/views/index.js
var express = require('express');
var router = express.Router();
var {User} = require('../models');
/* GET home page. */
router.get('/', function(req, res, next) {
User.find({where:{id:1}})
.then((user) => {
res.render('index', {
title: 'Express',
useremail: user.useremail});
});
});
module.exports = router;
User객체의 find함수로 레코드를 찾아서 변수 user에 담았다.
뜬금없이 find함수
가 나왔다. find함수는 sequelize의 함수로 레코드 하나를 조회하여 값을 가져오는 함수다.
쉽게 말해 SELECT 함수이다. 같은 SELECT 함수로는 findAll(), findAndCountAll() 등이 있다.
sql문으로는 SELECT `id`, `useremail`, `password`, `name` FROM `users` AS `user` WHERE `user`.`id` = 1;이다.
그렇게 조회한 레코드는 user객체에 저장되어있다. index.pug의 변수 #{useremail}에 조회한 user.useremail값을 넘겨주어서 화면에 출력했다.
결과 화면
원하는 대로 잘 출력 되었다.
Sequelize의 Query사용법
INSERT 함수
- create(values: Object, options: Object) : 레코드 생성 함수이다.
- findOrCreate(options: Object): 조회 시 없으면 생성해주는 함수이다.
- findCreateFind(options: Object) : 조회 시 없으면 생성 후 조회하는 함수이다.
- upsert(values: Object, options: Object) : 한 레코드만 인서트하거나 업데이트 해주는 함수.
SELECT 함수
- findOne(options: Object) : 하나만 조회하는 함수이다. find()와 동일
- findAll(options: Object) : 여러 개를 조회하는 함수이다.
- findAndCountAll(findOptions: Object) : 조회 후 총 수까지 알 수 있다. 조회 객체.count로 접근
- 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) : 한 개나 여러 레코드를 삭제하는 함수.
-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.docs에서 확인 가능하다.
Project/models/index.js
// Automagically generated join model
User.belongsToMany(Project, { through: 'UserProjects' })
Project.belongsToMany(User, { through: 'UserProjects' })
위 코드는 본 Project파일과 관계없음. Sequelize Documents에 나오는 코드.
models/index.js 부분에 위 코드처럼 foreignKey로 연결해주고 싶은 테이블 연결 해주면 됨.
var query = 'select * form user where name = admin';
sequelize.query(query)
.spread(function (results, metadata) {
// 쿼리 실행 성공
}, function (err) {
// 쿼리 실행 에러
});
직접 Query문을 사용할 때는 sequelize.query()
을 이용한다.
'Web > Node.js' 카테고리의 다른 글
[Nodejs] Pug 사용법 (9) | 2019.01.20 |
---|---|
[nodejs] 웹서버 운영하기 (0) | 2019.01.20 |