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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM