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 |