Node.js

[06.16] Sequelize

ljw4104 2021. 6. 16. 11:48

https://www.npmjs.com/package/sequelize

 

sequelize

Multi dialect ORM for Node.JS

www.npmjs.com

SQL을 몰라도 자바스크립트 구문을 알아서 SQL로 바꿔주는 라이브러리

 

https://www.npmjs.com/package/sequelize-cli

 

sequelize-cli

The Sequelize CLI

www.npmjs.com

Config 파일들을 알아서 만들어준다.

 

  1. npm init -y
  2. npm i sequelize mysql2 sequelize-cli

 

0. config.json 파일 수정

{
  "development": {
    "username": "root",
    "password": "<PASSWORD>",
    "database": "sequelize_db",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+09:00"
  },
  "test": {
    "username": "root",
    "password": "<PASSWORD>",
    "database": "sequelize_db",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+09:00"
  },
  "production": {
    "username": "root",
    "password": "<PASSWORD>",
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "define": {
    "charset": "utf8",
    "collate": "utf8_bin",
    "timestamps": true
  }
}

 

1. DB와 연결하기

const express = require("express");
const app = express();
const { Sequelize } = require("sequelize");
const port = 3000;

const sequelize = new Sequelize("mysql", "<ID>", "<PASSWORD>", {
  host: "<HOST>",
  dialect: "mysql",
});

app.get("/", (req, res) => {
  res.send("hello express");
});

app.get("/connectdb", (req, res) => {
  connect();
  res.send("db connection test.....");
});

async function connect() {
  try {
    await sequelize.authenticate();
    console.log("connected");
  } catch (err) {
    console.log(err);
  }
}

app.listen(port, () => {
  console.log("server is on");
});

Sequelize를 사용한 접근 테스트

 

 

2. Sequelize-Auto를 사용해서 DB접속 및 테이블 매핑

const SequelizeAuto = require("sequelize-auto");
const auto = new SequelizeAuto("nodejs", "root", "<PASSWORD>", {
  host: "localhost",
  port: "3306",
  dialect: "mysql",
});

auto.run((err) => {
  if (err) throw err;
  console.log("complete!");
});

제대로 매핑이 된 것이 보인다.

 

 

3. DB내용 불러오기

const initModels = require("./models/init-models");
const Sequelize = require("sequelize");
const users = require("./models/users");
const sequelize = new Sequelize("nodejs", "root", "1q2w3e4r!", {
  host: "localhost",
  dialect: "mysql",
});

const models = initModels(sequelize);
//CALLBACK으로 불러오기
// models.users.findAll().then((results) => {
//   console.log(results);
// });

//async await을 사용해서 불러오기
async function findAllFromUsers() {
  const results = await models.users.findAll();
  console.log(results);
}

findAllFromUsers();

SELECT `id`, `name`, `age`, `married`, `comment`, `created_at` FROM `users` AS `users`;

이 query를 실행한 결과와 동일하다.

 

 

4. 중복되는 부분 module로 빼기

mySequelize.js

const initModels = require("./models/init-models");
const Sequelize = require("sequelize");
const users = require("./models/users");
const sequelize = new Sequelize("nodejs", "root", "1q2w3e4r!", {
  host: "localhost",
  dialect: "mysql",
});

const models = initModels(sequelize);

module.exports = {
  models,
};

 

findall.js

const { models } = require("./mySequelize");

//CALLBACK으로 불러오기
// models.users.findAll().then((results) => {
//   console.log(results);
// });

//async await을 사용해서 불러오기
async function findAllFromUsers() {
  const results = await models.users.findAll();
  console.log(results);
}

findAllFromUsers();

위의 것과 동일한 결과가 나온다.

 

※ age가 30이상이고 married한 객체의 이름만 출력

const { Op, models } = require("./mySequelize");

//SELECT `name` FROM `users` AS `users` WHERE `users`.`age` >= 30 AND `users`.`married` = 1;
async function FindAllFromProducts() {
  const users = await models.users.findAll({
    //name column만 출력한다.
    attributes: ["name"],
    where: {
      age: {
        //age가 30보다 크거나 같은가?
        [Op.gte]: 30,
      },
      married: {
        //married값이 1과 동일한가?
        [Op.eq]: 1,
      },
    },
  });

  const json = JSON.stringify(users);
  console.log(json);
}

FindAllFromProducts();

그 외의 쿼리들은 아래에서 확인할 수 있다.

https://sequelize.org/master/manual/model-querying-basics.html

 

Manual | Sequelize

Model Querying - Basics Sequelize provides various methods to assist querying your database for data. Important notice: to perform production-ready queries with Sequelize, make sure you have read the Transactions guide as well. Transactions are important t

sequelize.org

 

============================================================================

 

app.js

const express = require("express");
const app = express();
const port = 3000;

const { Op, models } = require("./sequelize_common");

async function FindUsers() {
  const user = await models.users.findAll();
  const json = JSON.stringify(user);
  return json;
}

async function FindUser(value) {
  const user = await models.users.findAll({
    where: {
      id: {
        [Op.eq]: value,
      },
    },
  });
  const json = JSON.stringify(user);
  return json;
}

app.get("/api/users", async (req, res) => {
  let result;
  if (req.query === undefined) {
    result = await FindUsers();
  } else {
    const id = req.query.id;
    result = await FindUser(id);
  }
  res.send(result);
});

app.listen(port, () => {
  console.log("서버 동작중");
});

 

sequelize_common.js

const { Op, Sequelize } = require("sequelize");
const initModels = require("./models/init-models");
const users = require("./models/users");
const sequelize = new Sequelize("nodejs", "root", "1q2w3e4r!", {
  host: "localhost",
  dialect: "mysql",
});

const models = initModels(sequelize);

module.exports = {
  models,
  Op,
};