기본 콘텐츠로 건너뛰기

[Node.js] MySQL 테이블 사용하기

[Node.js] MySQL 테이블 사용하기

이제 MySQL에서 정의한 테이블을 시퀄라이즈에서도 정의해야 합니다.

users 테이블 comments 테이블

위의 테이블과 대응되는 User와 Comment 테이블을 만들어 테이블에 연결해봅시다. sequelize.define 메서드로 테이블명과 각 컬럼의 스펙을 입력합니다.

// models/user.js module.exports = (sequelize, DataTypes) =>{ return sequelize.define('user',{ name:{ type: DataTypes.STRING(20), allowNull: false, unique: true, }, age:{ type: DataTypes.INTEGER.UNSIGNED, allowNull: false, }, married:{ type: DataTypes.BOOLEAN, allowNull: false, }, comment:{ type: DataTypes.TEXT, allowNull: true, }, created_at:{ type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW, }, },{ timestamps: false, }); };

시퀄라이즈는 알아서 id를 기본 키로 연결하므로 id 컬럼은 적어줄 필요가 없습니다.

//models/comment.js module.exports = (sequelize, DataTypes)=>{ return sequelize.define('comment', { comment: { type: DataTypes.STRING(100), allowNull: false, }, created_at: { type: DataTypes.DATE, allowNull: true, defaultValue: DataTypes.NOW, }, }, { timestamps: false, }); // commenter 컬럼은 일단 생략되어 있음... 추후에 설명 };

시퀄라이즈의 자료형은 MySQL의 표현과 조금 다릅니다. VARCHAR는 STRING, INT는 INTEGER, TINYINT는 BOOLEAN, DATETIME은 DATE로 적습니다.

define의 세 번째 인자는 테이블 옵션입니다. 만약 timestamps의 값이 true이면 시퀄라이즈는 createdAt과 updateAt 컬럼을 추가합니다. 로우가 생성될 때와 수정될 때의 시간이 자동으로 입력됩니다.

모델을 생성햤다면 models/index.js와 연결합니다.

// models/index.js //... db.sequelize = sequelize; db.Sequelize = Sequelize; db.User = require('./user')(sequelize,Sequelize); db.Comment = require('./comment')(sequelize,Sequelize); module.exports = db;

db라는 객체에 User와 Comment 모델을 담아두었습니다.

마지막으로 config 폴더 안의 config.json을 수정합니다.

// config/config.js { "development": { "username": "root", "password": "1234", "database": "nodejs", "host": "127.0.0.1", "dialect": "mysql", "operatorsAliases": false }, //...

테이블간의 관계를 정의할 수 있습니다. 예를들어 사용자 한 명은 댓글을 여러 개 작성할 수 있습니다. 하지만 댓글 하나에 사용자(작성자)가 여러 명일 수는 없습니다. 이러한 관계를 일대다(多) 관계라고합니다. 이 외에도 일대일 다(多)대다(多) 관계가 있습니다.

1:N은 시퀄라이즈에서 hasMany 메서드로 표현합니다. 로우 하나를 불러 올 때 연결된 comments 테이블의 로우들도 같이 불러올 수 있습니다. 반대로 belongsTo 메서드도 있습니다. comments 테이블의 로우를 불러올 때 연결된 users 테이블의 로우를 가져옵니다.

models/index.js에서 모델들을 연결해준 곳 밑에 추가로 넣어줍니다.

// models/index.js //... db.sequelize = sequelize; db.Sequelize = Sequelize; 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'}); module.exports = db;

시퀄라이즈는 방금 정의한 대로 테이블 간의 관계를 파악합니다. 다음으로 npm start 명령어로 서버를 시작하면 메세지가 뜹니다.

npm start 이후 콘솔 메시지

SQL문을 자동으로 만들어 주는것을 확인할 수 있습니다.

이와 비슷한 방법으로 1:1 관계에서는 hasOne 메서드와 belongsTo 메서드를 사용하고, N:M 관계에서는 belongsToMany 메서드를 사용합니다. 특히, N:M 관계에서는 조회 할 때 여러 단계를 거쳐서 합니다.

시퀄라이즈로 CRUD 작업을 하기 위해서는 시퀄라이즈의 쿼리에 대해 알아야 합니다. 여러가지 예시를 알아봅시다.

// INSERT INTO nodejs.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 nodejs.users; User.findAll({}); // SELECT * FROM nodejs.users LIMIT 1; User.findOne({}); // SELECT name, married FROM nodejs.users; User.findAll({ attributes: ['name','married']; }); // SELECT name, age FROM nodejs.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 }, }, }); // SELECT id, name FROM users WHERE married=0 AND age > 30; const{ User, Sequelize: { Op } }= require('../models'); User.findAll({ attributes: ['id','name'], where:{ [Op.or]:[{married: 0}, {age: { [Op.gt]: 30 } }], }, }); // SELECT id, name FROM users ORDER BY age DESC; User.findAll({ attributes: ['id','name'], order:[['age','DESC']], }); // SELECT id, name FROM users ORDER BY age DESC LIMIT 1; User.findAll({ attributes: ['id','name'], order:[['age','DESC']], limit: 1, }); // SELECT id, name FROM users ORDER BY age DESC LIMIT 1 OFFSET 1; User.findAll({ attributes: ['id','name'], order:[['age','DESC']], limit: 1, offset: 1, });

// UPDATE nodejs.users SET comment = '바꿀내용' WHERE id=2; User.update({ comment:'바꿀내용', },{ where: {id: 2}, });

// DELETE FROM nodejs.users WHERE id=2; User.destroy({ where: {id:2}, });

출처 : Node.js 교과서

from http://badaturtle93.tistory.com/40 by ccl(A) rewrite - 2020-03-11 01:20:06

댓글

이 블로그의 인기 게시물

[Mac OS X] 데스크탑 응용프로그램 개발시작

[Mac OS X] 데스크탑 응용프로그램 개발시작 현재 회사에서 다음 프로젝트로 Mac OS X를 개발해야 하는 일정이 생겨 난생 처음 데스크탑 응용프로그램을 개발하기 공부를 시작했고 여러가지 플랫폼이 있다는것을 발견했다. 어떤 플랫폼을 사용해야할 지 먼저 고민해보자. 무엇으로 개발할것인가? Xcode & Swfit or Objective-C Mac OS X 는 objective-c를 기반으로 만들어졌다. apple에서 제공하는 Xcode와 objective-c 혹은 Swift로 응용 프로그램을 만들 수 있다. Electron Electron 프레임워크를 사용하면 javascript, HTML, CSS를 사용하여 크로스 플랫폼 데스크탑 응용 프로그램을 만들 수 있다. react-native-desktop Qt 프레임 워크를 기반으로하는 크로스 플랫폼이다. react-native 와 javascript로 응용 프로그램을 만들 수 있다. Qt는 컴퓨터 프로그래밍에서 GUI 프로그램 개발에 널리 쓰이는 크로스 플랫폼 프레임워크. 각 플랫폼의 장단점은 무엇인가? Xcode & Swfit or Objective-C - 장점 모든 OSX API에 직접 접근할 수 있다. Xcode를 통해 App Store에 쉽게 배포할 수 있다. - 단점 Windows 전용 응용 프로그램을 다시 개발해야한다. Swift언어를 모른다면 새로 공부해야 한다. Electron - 장점 웹스택을 가지고 빠르게 만들 수 있다. 다양한 플랫폼을 지원한다. - 단점 Native언어로 개발할때 보다 성능이 떨어질 이슈가있다. OS X API를 사용하는데 복잡하다. *API에 대한 JavaScript 래퍼가 없으면 자체 래퍼를 작성하지 않는 한 프로젝트에서 사용할 수 없습니다. React-native-desktop - 장점 현재 개발스택과 완전히 동일하므로 더 빠르게 개발 할 수 있다. 다양한 플랫폼을 지원한다. - 단점 N...

AWS CI/CD 파이프라인에 Slack 알람 적용(Lambda, CloudWatch Events 연동)

AWS CI/CD 파이프라인에 Slack 알람 적용(Lambda, CloudWatch Events 연동) 이번 글에서는 구축된 CI/CD 파이프라인과 Slack 알람을 연동하는 방법에 대해서 알아볼 것이다. CI/CD 파이프라인 시작/종료(성공/실패) 시 Amazon CloudWatch Events에서 해당 이벤트를 감지한 후 AWS Lambda로 트리거 신호를 보내면 AWS Lambda에서 Slack채널로 알람을 보내는 프로세스다. 글의 순서는 다음과 같다. Amazon CloudWatch Events, AWS Lambda란? 실습 전 준비사항 Slack Webhook 생성 AWS Lambda 함수 생성 AWS CloudWatch Events 생성 테스트 위와 같은 방식으로 구축을 하면 최종 프로세스는 다음 그림과 같다 (우리가 이 글에서 진행하는 내용은 빨간색으로 표시된 부분) 1. Amazon CloudWatch Events, AWS Lambda란? 1-1. Amazon CloudWatch Events란? Amazon CloudWatch Event(혹은 AWS CloudWatch Events)는 AWS 상태 변경 등을 감시할 수 있는 기능이다. 만약 사용자가 만든 규칙에 맞는 이벤트가 발생하게 되면 해당 이벤트가 사정에 정의된 규칙과 일치할 경우 하나 이상의 대상 작업을 호출한다. 이벤트 유형에 따라 알람을 보내거나, 이벤트 정보를 캡쳐하거나, 교정작업을 수행하거나, 이벤트를 시작하거나, 기타 작업을 수행할 수 있다. 이벤트가 발생할 경우 대상 작업은 AWS Lambda함수, AWS Kinesis 스트림, AWS SQS, Amazon SNS 등이 있다. 사용되는 사례로는 1) 이벤트가 발생하면 Lambda함수를 사용하여 Slack채널로 알림을 전달하거나, 2) AWS 상태 이벤트가 발생하면 Lambda 및 CloudWatch Events를 사용하여 Amazon SNS로 사용자 지정 텍스트 또는 SMS 알림을 보내는 등...

[2020-angstromCTF] web - A peculiar query write-up

[2020-angstromCTF] web - A peculiar query write-up English write-up UI seems like below. If you click the 'the source' link, you can get back-end source code. const express = require("express"); const rateLimit = require("express-rate-limit"); const app = express(); const { Pool, Client } = require("pg"); const port = process.env.PORT || 9090; const path = require("path"); const client = new Client({ user: process.env.DBUSER, host: process.env.DBHOST, database: process.env.DBNAME, password: process.env.DBPASS, port: process.env.DBPORT }); async function query(q) { const ret = await client.query(`SELECT name FROM Criminals WHERE name ILIKE '${q}%';`); return ret; } app.set("view engine", "ejs"); app.use(express.static("public")); app.get("/src", (req, res) => { res.sendFile(path.join(__dirname, "index.js")); }); app.get("/", async (req, res) => { if (req.query...