• node.js中对 mysql 进行增删改查等操作和async,await处理


    要对mysql进行操作,我们需要安装一个mysql的库。

    一、安装mysql库

    npm install mysql --save
    

      

    二、对mysql进行简单查询操作

    const mysql = require('mysql');
    
    //创建数据库连接
    let conn = mysql.createConnection({
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    //连接数据库
    conn.connect(function (err) {
        if (err) {
            throw err;
        }
        console.log('连接成功');
    });
    
    //查询数据库
    conn.query('select * from tb_user', function (err, data, field) {
        if (err) {
            throw err;
        }
        //data表示结果集数据,是一个数组
        console.log(data);
        data.forEach(function (value) {
            console.log(value.id, value.user_name, value.addr);
        });
        //表字段的详细信息
        console.log(field);
    });
    
    //关闭数据库连接
    conn.end();
    

      

    二、对mysql进行增删改操作

    const mysql = require('mysql');
    
    //创建数据库连接
    let conn = mysql.createConnection({
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    //连接数据库
    conn.connect(function (err) {
        if (err) {
            throw err;
        }
        console.log('连接成功');
    });
    
    //插入数据,query()方法可以对sql语句进行参数绑定,用?号作为占位符。
    conn.query('insert into tb_user values(null, ?, ?)', ['xxx', 'xxx'], function (err, data) {
        if (err) {
            throw err;
        }
        if (data && data.affectedRows) {
            console.log('插入数据成功,id为', data.insertId);
        }
    });
    
    //修改数据
    conn.query('update tb_user set user_name = ? where id = ?', ['ggg', 7], function (err, data) {
        if (err) {
            throw err;
        }
        if (data && data.affectedRows) {
            console.log('修改数据成功');
        }
    });
    
    //删除数据
    conn.query('delete from tb_user where id = ?', [5], function (err, data) {
        if (err) {
            throw err;
        }
        if (data && data.affectedRows) {
            console.log('删除数据成功');
        }
    });
    
    //关闭数据库连接
    conn.end();
    

      

    三、使用mysql连接池来优化对数据库的操作

    频繁的连接和断开mysql是比较消耗资源的,我们可以创建一个连接池,复用连接池中的连接,提高效率。

    const mysql = require('mysql');
    
    //创建数据库连接池
    let pool = mysql.createPool({
        //连接数量,默认是10
        connectionLimit: 20,
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    //pool.query()方法可以自动的帮我们在连接池中获取可用连接
    pool.query('select * from tb_user', function (err, data) {
        if (err) {
            throw err;
        }
        data.forEach(function (value) {
            console.log(value.id, value.user_name, value.addr);
        });
    });
    
    //当然我们也可以手动获取可用连接
    pool.getConnection(function (err, conn) {
        if (err) {
            throw err;
        }
        conn.query('select * from `order`', function (err, data) {
            if (err) {
                throw err;
            }
            data.forEach(function (value) {
                console.log(value.id, value.order_id, value.user_id);
            });
    
            //连接用完之后,需要释放,重新放回连接池中。
            //注意这里并没有销毁该连接,该连接仍然可用,但需要重新获取
            conn.release();
        });
    });
    
    //从连接池中获取连接时,将触发该事件
    pool.on('acquire', function (conn) {
        console.log('获取连接', conn.threadId);
    });
    
    //在连接池中建立新连接时,将触发该事件
    pool.on('connection', function (conn) {
        console.log('建立新连接', conn.threadId);
    });
    
    //等待可用连接时,将触发该事件
    pool.on('enqueue', function () {
        console.log('等待可用连接');
    });
    
    //当连接释放回池中时,触发该事件
    pool.on('release', function (conn) {
        console.log('连接被释放回池中', conn.threadId);
    });
    
    //结束池中所有的连接,不然node.js的事件循环会一直保持
    setTimeout(function () {
        pool.end(function (err) {
            console.log('关闭连接池');
            console.log(err);
        });
    }, 3000);
    

      

    四、按流的方式进行查询

    const mysql = require('mysql');
    
    //创建数据库连接
    let conn = mysql.createConnection({
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    let query = conn.query('select * from tb_user');
    //Query类继承自Sequence,而Sequence继承自EventEmitter
    //所以Query类的实例是可以监听事件
    
    //发生错误时
    query.on('error', function (err) {
        console.log(err);
    });
    
    //获取查询字段信息
    query.on('fields', function (fields) {
        console.log(fields);
    });
    
    //获取查询结果
    query.on('result', function (result) {
        //暂停获取结果
        conn.pause();
        //跟流的pause()和resume()很类似,控制获取数据的频率。
        setTimeout(function () {
            console.log(result);
            //恢复获取结果
            conn.resume();
        }, 1000);
    });
    
    //查询结束
    query.on('end', function () {
        console.log('查询结束');
    });
    
    conn.end();
    

    通过query.stream()方法返回一个可读流来获取数据

    const mysql = require('mysql');
    
    //创建数据库连接
    let conn = mysql.createConnection({
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    //从一个查询中获取一个可读流
    let qs = conn.query('select * from tb_user').stream({highWaterMark: 2});
    
    let result = [];
    qs.on('data', function (data) {
        result.push(data);
    });
    
    qs.on('end', function () {
        console.log('查询结束');
        console.log(result);
    });
    
    conn.end();
    

      

    五、mysql的事务处理

    const mysql = require('mysql');
    
    //创建数据库连接
    let conn = mysql.createConnection({
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    //连接数据库
    conn.connect(function (err) {
        if (err) {
            throw err;
        }
        console.log('连接成功');
    });
    
    //开启一个事务
    conn.beginTransaction(function (err) {
        if (err) {
            throw err;
        }
        conn.query('update account set money = money - 50 where name = ?', ['A'], function (err, data) {
            if (err) {
                //如果有错误则回滚
                return conn.rollback(function () {
                    throw err;
                });
            }
            conn.query('update account set money = money + 50 where name = ?', ['B'], function (err, data) {
                if (err) {
                    //如果有错误则回滚
                    return conn.rollback(function () {
                        throw err;
                    });
                }
                //提交事务
                conn.commit(function (err) {
                    if (err) {
                        //如果有错误则回滚
                        return conn.rollback(function () {
                            throw err;
                        });
                    }
                    console.log('处理成功');
                    conn.end();
                });
            });
        });
    });
    

      

    六、解决mysql嵌套回调的问题

    有些时候我们的操作需要上一个操作的结果,这样会导致比较深的嵌套问题,为了解决可以使用async和await来解决,而async和await又是基于promise的。

    const mysql = require('mysql');
    
    //创建数据库连接
    let conn = mysql.createConnection({
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    function query(conn, sql, params = []) {
        if (!conn) {
            return;
        }
        return new Promise(function (resolve, reject) {
            conn.query(sql, params, function (err, data) {
                if (err) {
                    reject(err);
                } else {
                    resolve(data);
                }
            });
        });
    }
    
    (async function () {
        let result = await query(conn, 'select * from tb_user');
        console.log(result);
        let row = await query(conn, 'select * from tb_user where id = ?', [result[0].id]);
        console.log(row);
        conn.end();
    })();
    

    当然我们还可以使用 util.promiseify() 进行包装。

    const mysql = require('mysql');
    const util = require('util');
    
    //创建数据库连接
    let conn = mysql.createConnection({
        //主机地址
        host: '127.0.0.1',
        //用户名
        user: 'root',
        //密码
        password: '123456',
        //数据库
        database: 'test',
        //端口
        port: 3306,
        //字符集
        charset: 'utf8'
    });
    
    //注意通过util.promisify进行包装的函数,必须满足
    //1、函数的最后一个参数是回调函数
    //2、回调函数的参数为(err, result),前者是错误,后者是正常结果
    //注意这里不要重新创建一个变量,不然会报错。
    conn.query = util.promisify(conn.query);
    
    (async function () {
        let result = await conn.query('select * from tb_user');
        console.log(result);
        let row = await conn.query('select * from tb_user where id = ?', [result[0].id]);
        console.log(row);
        conn.end();
    })();
    

      

  • 相关阅读:
    docker基本指令
    Process API
    Go的Context用法
    golang的可空类型和零值
    动态编程(DynamicObject、ExpandoObject)
    git clean
    SQL Server Join
    公用表表达式 Common Table Expression
    ubuntu安装mysql
    asp.net core-使用Nlog和log4net
  • 原文地址:https://www.cnblogs.com/jkko123/p/10299227.html
Copyright © 2020-2023  润新知