SQLite3 node js
SQLite
sqlite는 c언어 기반 SQL DB 엔진 라이브러리이다.
공식홈페이지 말로는, 세계에서 가장 많이 사용된 DB엔진이라고 한다.
SQLite는 모든 smart phone과 수없이 많은 프로그램,어플리케이션에 내장되어 있다고 한다.
아 그리고 SQLite의 모든 작업은 동기방식!
(mysql 대체해서 써보았다)
SQLite 설치
해당 작업 이후
본인은 windows10을 사용하고 있기 때문에,
sqlite명령어를 전역에서 사용하고 싶어서,
시스템 환경변수 path 에 sqlite 폴더를 추가해주었다.
이후
npm install sequelize-cli --save
서버프로젝트 폴더에서
sequelize-cli를 이용해서,
./node_modules/.bin/sequelize init
// 글로벌 설치했을 시에는 sequelize init으로 바로 호출 가능
->sequelize orm 기본 구성이 자동으로 구성된다.
sqlite [database.projectName]
-> 결과로 database.projectName이라는 sqlite database파일이 생성된다.
config에 연동할 db 정보 기입.
//sequelize init으로 생성된 config/config.json 파일
{
"development": {
"dialect": "sqlite",
"storage": "./생성된sqlite db파일",
.
.
.
}
table model생성
sequelize model:generate
--name User
--attributes
userId:string,
name:string,
engName:string//글로벌 설치가 아닌 경우, 위에서 한 것처럼 설치된 디렉토리에서 호출해야함.
//./node_modules/.bin/sequelize ...
결과로 sequelize 모델 파일과 migration 파일이 생성됨.
sequelize db:migrate
//이전 상태로 롤백 : sequelize db:migrate:undo
하면, 현재 model정보를 기준으로,
실제 database에 스키마를 생성한다. (migrate)
스키마를 업데이트 하려면
롤백하고, model을 수정하고, 다시 migrate해야 할까?
migration:create model명
아니다. sequelize seed 기능이 이런 상황을 위해 존재한다(아마)
생성된 테이블에 바로 칼럼을 추가할 수 있다.
./node_modules/.bin/sequelize seed:generate --name userData
seeders 디렉토리에 ‘userDate.js’가 생성이 되었을 것이다.
내용은 migration파일과 동일하게 up과 down메소드로 구성되어 있으나,
구체적인 코드는 비어있다.
module.exports = {
up: function (queryInterface, Sequelize) {
// 시드 데이터를 추가한다.
return queryInterface.bulkInsert('Users', [{
email: 'user1@mail.net',
name: 'user1'
}, {
email: 'user2@mail.net',
name: 'user2'
}], {});
},
down: function (queryInterface, Sequelize) {
// 추가했던 데이터를 삭제한다.
return queryInterface.bulkDelete('Users', {
email: {
$in: ['user1@mail.net', 'user2@mail.net']
}
}, {});
}
};
// 출처 : http://jeonghwan-kim.github.io/sequelize-seed-%EC%8B%9C%EB%93%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0/
위와 같이 ,up down을 bulkInsert, bulkDelete메소드를 이용해 구성한다.
해당 메소드의 인자는 대상이 되는 dbmodel, 추가or삭제할 정보,조건으로 구성된다.
서버가 on될 때, 어디에선가 api를 통해 최신 정보를 받아서, 제공하고 싶을 때, seed를 몰랐을 때에는 app.listen의 동작 전에 fetch와, db.create를 이용해 다소 지저분하게 했으나,
seed기능으로 미리 빼두고, 해당 명령어를 한 줄만 실행하도록 하면, 편리하지 않을까 싶었다.
이제 express 서버를 실행할 때, db와 연결되도록 설정을 해보자.
root/index.jsvar router = require('./routes.js');
app.use('/users', router);app.listen(...)routes.jsvar controller = require('../controller');var router = require('express').Router();router.get('/', controller.root.get);router.get('/:id', controller.id.get);
//요거는 query parameter쓰는 경우
//req.params.id 로 해당 위치 값 호출 가능module.exports = router;/src/controller/index.js const models = 'models디렉토리 위치'
//이 한줄로 모든 model의 db명에 접근 할 수 있게 된다.module.exports = {root: {get: async function (req, res) {// console.log('controller messages get 진입');try{models.Users.findAll().then(result => {if(result) {res.status(200).json(result) // OK //보관주소 있으면, json형태로 발사} else {res.sendStatus(204); // No Content}}).catch(error => {console.log(error)res.status(500).send(error) // Server error})}catch(error){console.error(error);}}},}
sequelizer 훠얼씬 정리 잘돼있는 블로그