mysql2 promise - Node.js

createConnection で接続する

const mysql = require('mysql2/promise');

(async () => {
  const connection  = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    database: 'sample',
    password: 'password',
  });

  try {
    const [results, fields] = await connection.execute('SELECT * FROM users WHERE id = ?', [1]);
    console.log(results);
  } catch (err) {
    console.log(err);
  }
  connection.end()
})();

接続プールを用意して接続する

接続プールとは、接続する際、要求されるたびに接続を作成するのではなく、接続を保持して再利用するという機能です。

mysql2では、プールはすべての接続を事前に作成するのではなく、接続制限に達するまでオンデマンドで作成します。

const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'sample',
  password: 'password',
});

(async () => {
  try {
    const [results, fields] = await pool.query('SELECT * FROM users');
    console.log(results);
  } catch (err) {
    console.log(err);
  }
  pool.end();
})();

データベースの作成

script.js

const mysql = require('mysql2/promise');

(async () => {
  const pool  = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
  });

  find_db = 'SHOW DATABASES LIKE "myapp"';
  create_db = 'CREATE DATABASE myapp';

  try {
    const [results, fields] = await pool.query(find_db);
    console.log(results)
    console.log(fields)

    // データベースがなければ作成
    if(!results.length){
      const [results, fields] = await pool.query(create_db);
    }
    
  } catch (err) {
    console.log(err);
  }
  pool.end()
})();

テーブルとレコードの作成

script.js

const mysql = require('mysql2/promise');
const crypto = require("crypto");

(async () => {
  const pool  = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    database: 'node',
    password: 'password',
  });

  const password ='password';
  const salt = '04226f37800c1dc5a80ab2fac6f6824700c81b235ae90459a24e648060148c82a195c766fd068aca7009f3943c193ed1775af8daae4a6cad4841b2a7ce0177aea6';
  const sha512 = crypto.createHash('sha512');
  sha512.update(password + salt);
  const hash = sha512.digest('hex')

  // find_table = "SELECT * FROM information_schema.tables WHERE table_schema = 'node' AND table_name = 'user';"
  find_table = 'SHOW TABLES LIKE "user"'

  create_table = 'CREATE TABLE user (id INT AUTO_INCREMENT, mail VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, PRIMARY KEY (id));'
  create_record = `INSERT INTO user (mail, password) VALUES ("test", "${hash}");`

  try {
    const [results, fields] = await pool.query(find_table);
    console.log(results)
    console.log(fields)

    // テーブルがなければテーブルを作成
    if(!results.length){
      const [results, fields] = await pool.query(create_table);
      const [results2, fields2] = await pool.query(create_record);
      console.log(results2)
    }
  } catch (err) {
    console.log(err);
  }
  pool.end()
})();

テーブルの存在を確認する SQL は以下の方法でも調べることができます。

SELECT * FROM information_schema.tables WHERE table_schema = 'node' AND table_name = 'user';

SELECT * FROM information_schema.tables WHERE table_schema = 'データベース名' AND table_name = 'テーブル名';

namedPlaceholders

namedPlaceholders を有効にすることで、SQL文を発行する時のプレースホルダーが ? や ?? だけでなく、オブジェクトとキー名で指定できるようになります。

const mysql = require('mysql2/promise');

(async () => {
  const connection  = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    database: 'sample',
    password: 'password',
    namedPlaceholders: true,
    connectionLimit: 5,
  });

  try {
    const [results, fields] = await connection.query('SELECT * FROM user WHERE id = :id', {id: 4});
    console.log(results);
    console.log(fields);
  } catch (err) {
    console.log(err);
  }
  connection.end()
})();

レコードを登録したIDを取得する

登録したレコードのIDを取得し、そのIDを使って文字列を整形して同じレコードに登録します。

const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'sample',
});

function zeroPadding(num, digit){
  let ret = (('0'.repeat(digit)) + num).slice(-digit);
  return ret;
}

// データを挿入してIDを取得し、レコードを更新する関数
async function insertDataAndUpdateRecord(data) {
  try {
    // データを挿入
    const insertQuery = 'INSERT INTO user (mail, password) VALUES (?, ?)';
    const [insertResult] = await pool.query(insertQuery, [data.column1, data.column2]);

    // 挿入されたレコードのIDを取得
    const insertedId = insertResult.insertId;
    console.log('Inserted record ID:', zeroPadding(insertedId, 5));

    // 挿入されたレコードを更新してCSDを追加
    const updateQuery = 'UPDATE user SET user_id = ? WHERE id = ?';
    const [updateResult] = await pool.query(updateQuery, [`user${zeroPadding(insertedId, 5)}`, insertedId]);
    console.log('Record updated with CSD:', updateResult.affectedRows);

    const [getResult] = await pool.query("SELECT * FROM user WHERE id = ?", [insertedId])
    console.log(getResult)
  } catch (err) {
    console.error('Error:', err);
  } finally {
    // 接続を閉じる
    pool.end();
  }
}

// データを挿入する例
const newData = { column1: '', column2: 'value2' };
insertDataAndUpdateRecord(newData);