[Udemy] Introducing Node

Creating the dots·2022년 1월 18일
0

SQL

목록 보기
19/21
post-thumbnail

The Ultimate MySQL Bootcamp 16강을 공부하며 정리한 내용입니다.

16강에서는 Node.js와 MySQL을 사용해서 간단한 웹앱(JOIN US)를 구현한다.

JOIN US

A Startup Mailing List Application
: collecting people's emails to send updates or invite them

  • Web App features
    • inserting email data
    • select total counts of email data
  • Node package
    • withshepherd/faker (faker has been deleted for some reason. use npm install @withshepherd/faker instead)
    • mysql

NodeJS의 mysql 패키지를 설치해 Node와 MySQL을 연결하고 Faker 패키지를 설치해 500개 이상의 랜덤 유저 이메일을 생성하고 DB에 추가해보자.

Nodejs와 DB 연결

const faker = require("@withshepherd/faker");
const mysql = require("mysql");

const connection = mysql.createConnection({
  host: "localhost",
  user: process.env.USER,
  password: process.env.PW,
  database: process.env.DATABASE,
});

//예시
const query = "SELECT CURTIME() AS time, CURDATE() AS date, NOW() AS now";
connection.query(query, function (err, results, fields) {
  if (err) throw err;
  console.log("The solution is: ", results[0]);
});
connection.end();

테이블 생성

//schema.sql
//source /schema.sql
CREATE TABLE users (
    email VARCHAR(255) PRIMARY KEY,
    created_at TIMESTAMP DEFAULT NOW()
);

데이터 추가 (연습)

const person = {
  email: 'Jenny55@gmail.com'
};
const query = 'INSERT INTO users SET ?'
connection.query(query, function (err, results, fields) {
  if(err) throw err;
  console.log(results);
})'
connection.end();

//위의 쿼리문은 다음과 동일하다.
const query = 'INSERT INTO users (email) VALUES ('Jenny55@gmail.com')'

//faker를 사용해 동적으로 데이터 추가하기
const person = {
  email: faker.internet.email(),
  created_at: faker.date.past()
};
const query = 'INSERT INTO users SET ?';
connection.query(query, person, function(err, results, fields) {
  if(err) throw err;
  console.log(results);
});

데이터 추가 (bulk insert, 500개)

const data = [];
for(let i=0; i<500; i++){
  data.push([
    faker.internet.email(),
    faker.data.past()
  ]);
}
//console.log(data);
/*
[
  [ 'Elva62@yahoo.com', 2021-07-09T05:43:47.154Z ],
  [ 'Joseph.Gerlach@gmail.com', 2021-02-26T16:45:10.016Z ],
  [ 'Nadia28@yahoo.com', 2021-05-15T14:43:03.037Z ],
  [ 'Rico.Beer@yahoo.com', 2021-01-28T06:19:29.752Z ], ...
]
*/
const query = 'INSERT INTO users (email, created_at) VALUES ?';
connection.query(query, [data], function(err, results, fields) {
  if(err) throw err;
  console.log(results);
});
connection.end();

날짜 데이터에 관하여,,

🔍 MySQL에 직접 날짜를 입력하고, MySQL에 저장되는 형식과 다르게 저장한다면 다음과 같은 에러가 발생한다.

INSERT INTO (email, created_at) VALUES ('soh@gmail.com','MON')

🔍 faker 패키지의 faker.date.past()로 만들어진 날짜도 위의 예시처럼 MySQL에 저장되는 형식과 다르다. 만약 mysql 패키지에서 쿼리문을 보내도 에러가 발생할까?

const person = {
  email: faker.internet.email(),
  created_at: faker.date.past(),
};
console.log(person); 
//{ email: 'Jon14@yahoo.com', created_at: 2022-01-06T17:23:52.418Z }
const query = "INSERT INTO users SET ?";
const res = connection.query(query, person, function (err, results, fields) {
  if (err) throw err;
  console.log(results);
});
console.log(res.sql);
//INSERT INTO users SET `email` = 'Clinton38@gmail.com', `created_at` = '2021-09-22 15:42:48.828'

위에서 볼 수 있는 것처럼 mysql 패키지를 통해 MySQL DB에 데이터를 추가하는 경우, 전달한 created_at의 데이터타입은 DB에서 저장되는 데이터타입과 다르지만, 패키지 자체적으로 문자열로 전환해 전송함으로써 DB에 적절하게 데이터가 추가된다.

이 내용은 mysqljs/mysql에서 확인할 수 있다.


Quick Check

🔍 다음 데이터를 조회하는 쿼리문을 작성해보자.

SELECT 
  DATE_FORMAT(min(created_at), '%M %D %Y') 
  AS earliest_date 
FROM users;

SELECT * 
FROM users 
WHERE created_at = (SELECT MIN(created_at) FROM users);

SELECT 
  MONTHNAME(created_at) AS month,
  count(*) AS count 
FROM users 
GROUP BY month 
ORDER BY count;

SELECT
  count(*) AS yahoo_users 
FROM users 
WHERE email LIKE '%@yahoo.com';      

SELECT 
  CASE 
    WHEN email LIKE '%@gmail.com%' THEN 'gmail'
    WHEN email LIKE '%@yahoo.com%' THEN 'yahoo'
    WHEN email LIKE '%@hotmail.com%' THEN 'hotmail'
    ELSE 'other'
  END AS provider,
  COUNT(*) as total_users
FROM users
GROUP BY provider
ORDER BY total_users DESC;
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글