zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    The test form is only available for requests from the local machine
    64位Win7下,先安装Visual Studio,后安装IIS的设置步骤
    [转] 如何在 64 位的 Windows 7 中安裝 PLSQL DEVELOPER 8 和 Oracle 11g x64 Client
    excel对csv的转义
    js中没有引用的匿名函数调用方法
    缓存实现条件
    js对象成员的删除特性 (delete)
    js语法作用域之间的相关性
    【转】UBOOT之四:uboot.lds分析
    linux C 中的volatile使用
  • 原文地址:https://www.cnblogs.com/sochishun/p/14295053.html
Copyright © 2011-2022 走看看