7. MySQL

Donghun Seol·2022년 9월 23일
0

node.js 교과서

목록 보기
9/12

7. MySQL

7.1 데이터베이스란?

7.2 MySQL 설치하기

M1 Mac에 Docker로 MySQL설치하기

docker pull mysql 

docker images

//mysql-container 최초 실행
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
docker ps-a

docker stop mysql-container
docker start mysql-container
docker restart mysql-container

//mysql-container shell 접속
docker exec -it mysql-container bash

7.3 워크벤치 설치하기

생략

7.4 데이터베이스 및 테이블 생성하기

기본적인 내용이므로 생략

7.5 CRUD 작업하기

기본적인 내용이므로 생략

7.6 시퀄라이즈 사용하기

시퀄라이즈란?

MySQL, MariaDB, PostgreSQL, SQLite에 사용가능한 js ORM

시퀄라이즈 설치하기

npm i sequelize sequelize-cli mysql2
npx sequelize init # initialization with boilerplates

MySQL 연결하기

config.json 설정 한 다음, 코드에서

const { sequelize } = require('./models');

sequelize.sync({ force: false })
	.then( () => console.log("success"));
	.catch( err => console.error(err));

모델 정의하기

모델은 DB의 테이블을 의미함
Sequelize는 자동으로 id컬럼을 생성해준다.
MySQL과 Sequelize의 자료형이 조금씩 다름을 기억해두자.

const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model {
  static init(sequelize) { // init gets two args
    return super.init({ /* model defined obj */}, {/*table options */});
  }
  static associate(db) {}
};

모델 생성 후에는 ./models/index.js에서 모델을 연결하고 활성화한다.

const Sequelize = require('sequelize');
const User = require('./user');
const Comment = require('./comment');

db.sequelize = sequelize;
db.User = User;
db.Comment = Comment;

User.init(sequelize);
Comment.init(sequelize);

User.associate(db);
Comment.associate(db);

module.exports = db;

관계 정의하기

1:N

hasMany 메서드로 정의한다. 각각의 모델 클래스의 스태틱 메서드로 아래를 추가해준다.

// user.js
static associate(db) {
  db.User.hasMany(db.Comment, {foreignKey : 'commenter', sourceKey: 'id'});
// comment.js
static associate(db) {
  db.Comment.belongsTo(db.User, {foreignKey : 'commenter', sourceKey: 'id'});

1:1

hasOne과 belongsTo 메서드를 활용해서 정의한다.
두 메서드를 논리적으로 적합하게 사용해야 한다.

N:M

N:M 관계의 특성상 새로운 모델이 생성되고, 그 이름을 through 속성에 명시해준다.

db.Post.belongsToMany(db.Hashtag, {through: 'PostHashtag' });
db.Hashtag.belongToMany(db.Post, {through: 'PostHashtag' });

쿼리 알아보기

(당연하지만) 쿼리는 프로미즈를 반환한다.
.then과 async / await를 활용 가능하다.
Op.gt Op.gte Op.lt Op.lte Op.ne Op.or Op.in Op.notIn 등의 연산자 활용가능하다.

User.create({});

User.findAll({
  attributes: ['name', 'age'],
  order: [['age','DESC'], ['name', 'ASC']],
  where: { // 조건절 활용
    married: true,
    age: { [Op.gt]: 30}, // 연산자 활용 ES6 문법으로 동적 속성을 선언한 것
  },
});

User.findOne({});

관계 쿼리
SQL의 조인기능을 간단하게 지원한다.

const user = await User.findOne({
  include: [{
    model: Comment,
  }]
});
console.log(user.Comments);

// 나눠서 관계쿼리 수행도 가능하다.
// getComments() automatically created by Sequelize
const user = await User.findOne({});
const comments = await user.getComments();
console.log(comments);

// where clause available
const comment = user.getComments({
  where: {
    id: 1,
  },
  attributes: ['id'],
});

SQL 직접 쿼리도 당연히 가능하다.

const [result, metadata] = await sequelize.query('SELECT * from comments');
console.log(result);

쿼리 수행하기

profile
I'm going from failure to failure without losing enthusiasm

0개의 댓글