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 では、プールはすべての接続を事前に作成するのではなく、接続制限に達するまでオンデマンドで作成します。簡単に言うと、mysql2 の接続プール (createPool()) は、最初から大量の接続を作らず、必要に応じて接続を増やしていく という仕組みです。
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();
})();
データベースの作成
const mysql = require('mysql2/promise');
(async () => {
const connection = 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 connection.query(find_db);
console.log(results)
console.log(fields)
// データベースがなければ作成
if(!results.length){
const [results, fields] = await connection.query(create_db);
}
} catch (err) {
console.log(err);
}
connection.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);