NodeJs 简单的使用 MySQL2 扩展包的项目示例

NodeJs 简单的使用 MySQL2 扩展包的项目示例

安装依赖包
mysql2插件官网:https://github.com/sidorares/node-mysql2
更详细的文档需移步mysql插件官网:https://github.com/mysqljs/mysql

npm install mysql2

数据库配置文件(config/database.js)

// 文件路径:config/database.js

module.exports = {
    // 数据库类型
    'type': 'mysql',
    // 服务器地址
    'hostname': '127.0.0.1',
    // 数据库名
    'database': 'db_test',
    // 用户名
    'username': 'root',
    // 密码
    'password': '123456',
    // 端口
    'hostport': '3306',
    // 数据库连接参数
    'params': [],
    // 数据库编码默认采用utf8/utf8mb4
    'charset': 'utf8mb4',
}

数据库连接池文件(utils/db_connection.js)

// 文件路径:utils/db_connection.js
/**
 * 数据库连接池
 */
const nm_mysql = require('mysql2/promise');

const databaseConfig = require('../config/database.js');

const connPool = nm_mysql.createPool({
    user: databaseConfig.username,
    password: databaseConfig.password,
    host: databaseConfig.hostname,
    port: databaseConfig.port,
    charset: databaseConfig.charset,
    database: databaseConfig.database
})

// 进程退出时自动关闭连接池
process.on('exit', async (code) => {
    try {
        await connPool.end()
    } catch (error) {

    }
})
module.exports = {
    connPool,
    databaseConfig
};

数据库通用操作文件(utils/db_utils.js)

// 文件路径:utils/db_utils.js
/**
 * 数据库通用操作文件
 */
const {
    connPool,
    databaseConfig
} = require('./db_connection.js')

/**
 * 返回所有数据表
 * @param {String} dbname
 * @param {String} tablename
 * @return array TABLE_NAME, TABLE_TYPE, ENGINE, DATA_LENGTH, CREATE_TIME, TABLE_COLLATION, TABLE_COMMENT
 */
async function getTables(dbName, tablename = '') {
    if (!dbName) {
        dbName = databaseConfig.database;
    }
    let sql = `select TABLE_NAME, TABLE_TYPE, ENGINE, DATA_LENGTH, CREATE_TIME, TABLE_COLLATION, TABLE_COMMENT 
        from information_schema.tables where TABLE_SCHEMA=? AND TABLE_TYPE='BASE TABLE'`;
    const [rows, fields] = await connPool.query(sql, [dbName]);
    return rows;
}

/**
 * 返回所有列
 * @param {String} dbname
 * @param {String} tablename
 * @param {Boolean} withKeyName
 * @return array COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE,
 *      EXTRA, COLUMN_DEFAULT, COLUMN_TYPE, COLUMN_KEY, COLUMN_COMMENT
 */
async function getFields(dbName, tableName, withKeyName = false) {
    if (!dbName) {
        dbName = databaseConfig.database;
    }
    let sql = `select COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, COLUMN_TYPE, IS_NULLABLE, EXTRA, DATA_TYPE, 
        CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, COLUMN_KEY, COLUMN_COMMENT from 
        information_schema.columns WHERE TABLE_SCHEMA=? AND TABLE_NAME=? order by ORDINAL_POSITION`
    const [rows, fields] = await connPool.query(sql, [dbName, tableName]);
    return rows;
}

module.exports = {
    getTables,
    getFields,
    connPool,
    databaseConfig
}

主文件(main.js)

// 文件路径:main.js

const nm_fs = require('fs');
const nm_path = require('path');
const dbUtils = require('./utils/db_utils.js')

// 普通查询测试
async function test() {
    const rows = await dbUtils.getTables('');
    console.log(rows);
}

// 事务测试
async function testTrans() {
    // 创建连接
    let conn = await dbUtils.connPool.getConnection();
    // 开启事务
    await conn.beginTransaction();
    try {
        const [rows] = await conn.execute('select * from pedm_auth_admin')
        if (rows.length > 0) {
            const userName = rows[0].user_name;
            // 必然正确的命令
            await conn.execute('update pedm_auth_admin set updated_at=?,login_count=login_count+1 where user_name=?', [new Date().getTime() / 1000, userName]);
            // 必然出错的命令
            // await conn.execute('update pedm_auth_admin set updated_at=?,login_count=login_count+error where user_name=?', [new Date().getTime() / 1000, userName]);
        }
        // 提交事务
        await conn.commit();
        console.log('事务成功提交');
    } catch (error) {
        // 回滚事务
        conn.rollback();
        console.log('事务回滚', error.sqlMessage, error);

    }
    // 释放连接
    conn.release();
}

// 执行
// test();
testTrans();

运行

node main.js