[Udemy] Introducing Node


TheUltimate MySQL Bootcamp 16強を勉強してまとめた内容です
ベスト16ではノードjsとMySQLで簡単なWebアプリケーション(JOINUS)を実現します.

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: '[email protected]'
    };
    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);
    });

    データの追加(buckinsert,500個)

    const data = [];
    for(let i=0; i<500; i++){
      data.push([
        faker.internet.email(),
        faker.data.past()
      ]);
    }
    //console.log(data);
    /*
    [
      [ '[email protected]', 2021-07-09T05:43:47.154Z ],
      [ '[email protected]', 2021-02-26T16:45:10.016Z ],
      [ '[email protected]', 2021-05-15T14:43:03.037Z ],
      [ '[email protected]', 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 ('[email protected]','MON')

    🔍 fakerパッケージfaker.date.past()によって作成された日付も、上記の例でMySQLに格納されているフォーマットとは異なります.mysqlパッケージがクエリー文を送信してもエラーが発生しますか?
    const person = {
      email: faker.internet.email(),
      created_at: faker.date.past(),
    };
    console.log(person); 
    //{ email: '[email protected]', 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` = '[email protected]', `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;