12
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Node.jsでpromise-mysqlを扱ってみたかったので独自目線で纏めた

Last updated at Posted at 2018-03-05

はじめに

どうも、また私です。
今度はpromise-mysqlを扱ってみようと思います。
例の如く手探りです。

ここへ至る経緯はこっちから
Node.jsでMySQLを扱いたかったので独自目線で纏めた

簡単な動作確認

設定

setting.js
const mysql = require('/usr/local/lib/node_modules/promise-mysql');

mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
}).then(function(conn) {
    // do stuff with conn
    console.log('promise-mysql createConnection.');
    console.log(conn);
    conn.end();
});

SELECT

select1.js
const mysql = require('/usr/local/lib/node_modules/promise-mysql');

mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
}).then(function(conn) {
    // do stuff with conn
    console.log('promise-mysql createConnection.');
    // console.log(conn);

    // select
    const result = conn.query('SELECT * FROM node_mysql_test');
    conn.end();
    return result;
}).then(function(rows) {
    console.log(rows);
});
select2.js
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
let connection;

mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
}).then(function(conn) {
    // do stuff with conn
    console.log('promise-mysql createConnection.');
    // console.log(conn);
    connection = conn;
    // select
    const result = connection.query('SELECT * FROM node_mysql_test');
    connection.end();
    console.log(result);
    return result;
}).then(function(rows) {
    // result
    console.log('SELECT is Success!');
    console.log(rows);
}).catch(function(error) {
    if (connection && connection.end) connection.end();
    //logs out the error
    console.log('catch error.');
    console.log(error);
});

INSERT

insert.js
/**
 * promise-mysql module
 * @type       {Object}
 */
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
/**
 * table name
 * @type       {string}
 */
const TABLE_NAME = 'node_mysql_test';
/**
 * connection
 * @type       {Object}
 */
let conn;
let connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
}).then(function(connect) {
    console.log('promise-mysql connect.');
    conn = connect;
    // insert
    const sql = 'INSERT INTO ' + TABLE_NAME + ' SET ?';
    const inserts = {name: '鷲尾雷'};
    const result = conn.query(sql, inserts);
    console.log(result);
    return result;
}).then(function(res) {
    console.log(res);
    // select
    const result = conn.query('SELECT * FROM node_mysql_test');
    conn.end();
    return result;
}).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
}).catch(function(error) {
    if (conn && conn.end) conn.end();
    //logs out the error
    console.log('catch error.');
    console.log(error);
});

UPDATE

update.js
/**
 * promise-mysql module
 * @type       {Object}
 */
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
/**
 * table name
 * @type       {string}
 */
const TABLE_NAME = 'node_mysql_test';
/**
 * connection
 * @type       {Object}
 */
let conn;
let connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
}).then(function(connect) {
    console.log('promise-mysql connect.');
    conn = connect;
    // insert
    const sql = 'UPDATE ' + TABLE_NAME + ' SET age = ? WHERE name = ?';
    const inserts = [35, '氷室'];
    const result = conn.query(sql, inserts);
    console.log(result);
    return result;
}).then(function(res) {
    console.log(res);
    // select
    const result = conn.query('SELECT * FROM node_mysql_test');
    conn.end();
    return result;
}).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
}).catch(function(error) {
    if (conn && conn.end) conn.end();
    //logs out the error
    console.log('catch error.');
    console.log(error);
});

おめでとう!氷室さんの正しい年齢が記録されました!

DELETE

delete.js
/**
 * promise-mysql module
 * @type       {Object}
 */
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
/**
 * table name
 * @type       {string}
 */
const TABLE_NAME = 'node_mysql_test';
/**
 * connection
 * @type       {Object}
 */
let conn;
let connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
}).then(function(connect) {
    console.log('promise-mysql connect.');
    conn = connect;
    // delete
    const sql = 'DELETE FROM ' + TABLE_NAME + ' WHERE name = ?';
    const inserts = ['葛城'];
    const result = conn.query(sql, inserts);
    console.log(result);
    return result;
}).then(function(res) {
    console.log(res);
    // select
    const result = conn.query('SELECT * FROM node_mysql_test');
    conn.end();
    return result;
}).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
}).catch(function(error) {
    if (conn && conn.end) conn.end();
    //logs out the error
    console.log('catch error.');
    console.log(error);
});

SELECT書き方他にも

select3.js
/**
 * promise-mysql module
 * @type       {Object}
 */
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
/**
 * table name
 * @type       {string}
 */
const TABLE_NAME = 'node_mysql_test';
/**
 * pool
 * @type       {Object}
 */
let conn;
let pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
});

let sql = 'SELECT * FROM ' + TABLE_NAME;
pool.query(sql).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
}).catch(function(error) {
    //logs out the error
    console.log('catch error.');
    console.log(error);
});
select4.js
/**
 * promise-mysql module
 * @type       {Object}
 */
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
/**
 * table name
 * @type       {string}
 */
const TABLE_NAME = 'node_mysql_test';
/**
 * pool
 * @type       {Object}
 */
let conn;
let pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
});

pool.getConnection().then(function(connection) {
    let sql = 'SELECT * FROM ' + TABLE_NAME;
    connection.query(sql).then(function(rows) {
        // select is success
        console.log('SELECT is Success!');
        console.log(rows);
    });
}).catch(function(error) {
    //logs out the error
    console.log('catch error.');
    console.log(error);
    done(error);
});

トランザクションを実装したい

node-mysqlのときより全然見やすいです。

transaction.js
/**
 * promise-mysql module
 * @type       {Object}
 */
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
/**
 * table name
 * @type       {string}
 */
const TABLE_NAME = 'node_mysql_test';
/**
 * connection
 * @type       {Object}
 */
let conn;
mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs'
}).then(function(connect) {
    console.log('promise-mysql connect.');
    conn = connect;
    // console.log(conn);
    const result = conn.beginTransaction();
    return result;
}).then(function(res) {
    console.log(res);
    let sql = 'SELECT * FROM ' + TABLE_NAME;
    return conn.query(sql);
}).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
    // insert data
    let sql = 'INSERT INTO ' + TABLE_NAME + ' SET ?';
    let inserts = {name: '桐生', age: 26};
    const result = conn.query(sql, inserts);
    return result;
}).then(function(res) {
    console.log('INSERT is Success!');
    console.log(res);
    // const result = conn.rollback();    // ここでロールバック発動すれば実行されずに終わる
    const result = conn.commit();
    return result;
}).then(function(res) {
    console.log('COMMIT Success!');
    console.log(res);
    // select data
    let sql = 'SELECT * FROM ' + TABLE_NAME;
    const result = conn.query(sql);
    return result;
}).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
    return Promise.resolve(1);    // 次のFunctionに行く引数
}).then(function(res) {
    console.log(res);
    // 最後に必ずコネクションを開放する
    if (conn)
    {
        conn.end();
    }
});

コネクションプールについて

pool.js
/**
 * promise-mysql module
 * @type       {Object}
 */
const mysql = require('/usr/local/lib/node_modules/promise-mysql');
/**
 * table name
 * @type       {string}
 */
const TABLE_NAME = 'node_mysql_test';
/**
 * connection
 * @type       {Object}
 */
let conn;
/**
 * pool
 * @type       {Object}
 */
let pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs',
    connectionLimit: 10,
})

pool.getConnection().then(function(connect) {
    console.log('promise-mysql connect.');
    conn = connect;
    // console.log(conn);
    const result = conn.beginTransaction();
    return result;
}).then(function(res) {
    console.log(res);
    let sql = 'SELECT * FROM ' + TABLE_NAME;
    return conn.query(sql);
}).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
    // insert data
    let sql = 'INSERT INTO ' + TABLE_NAME + ' SET ?';
    let inserts = {name: '最上', age: 52};
    const result = conn.query(sql, inserts);
    return result;
}).then(function(res) {
    console.log('INSERT is Success!');
    console.log(res);
    // const result = conn.rollback();    // ここでロールバック発動すれば実行されずに終わる
    const result = conn.commit();
    return result;
}).then(function(res) {
    console.log('COMMIT Success!');
    console.log(res);
    // select data
    let sql = 'SELECT * FROM ' + TABLE_NAME;
    const result = conn.query(sql);
    return result;
}).then(function(rows) {
    // select is success
    console.log('SELECT is Success!');
    console.log(rows);
    return Promise.resolve(1);    // 次のFunctionに行く引数
}).then(function(res) {
    console.log(res);
    // 最後に必ずコネクションを開放する
    // console.log(conn);
    // if (conn && conn.end)
    // {
    //     conn.end();
    // }
    pool.releaseConnection(conn);
}).catch(function(err) {
    console.log('catch error.');
    done(err);
});

poolの場合はpool.getConnection()で始まりpool.releaseConnection(connection)で終わる。

async/awaitで書けないの?

書けます。むしろこっちのほうがスマート。

async_await.js
async mysqlSelect()
{
    let conn = await mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: '',
        database: 'nodejs'
    });

    let sql = 'SELECT * FROM ' + TABLE_NAME;
    const result = await conn.query(sql);
    console.log(result);
}

おわりに

この記事はまだ更新予定です。
また、情報があればコメントにていただけますと幸いです。
よろしくお願いいたします。

12
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?