zoukankan      html  css  js  c++  java
  • 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();
    })();
    

      

  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/jkko123/p/10299227.html
Copyright © 2011-2022 走看看