node.js中 mysql 增删改查操作及async,await处理实例分析
本文实例讲述了node.js中mysql增删改查操作及async,await处理。分享给大家供大家参考,具体如下:
要对mysql进行操作,我们需要安装一个mysql的库。
一、安装mysql库
npminstallmysql--save
二、对mysql进行简单查询操作
constmysql=require('mysql'); //创建数据库连接 letconn=mysql.createConnection({ //主机地址 host:'127.0.0.1', //用户名 user:'root', //密码 password:'123456', //数据库 database:'test', //端口 port:3306, //字符集 charset:'utf8' }); //连接数据库 conn.connect(function(err){ if(err){ throwerr; } console.log('连接成功'); }); //查询数据库 conn.query('select*fromtb_user',function(err,data,field){ if(err){ throwerr; } //data表示结果集数据,是一个数组 console.log(data); data.forEach(function(value){ console.log(value.id,value.user_name,value.addr); }); //表字段的详细信息 console.log(field); }); //关闭数据库连接 conn.end();
二、对mysql进行增删改操作
constmysql=require('mysql'); //创建数据库连接 letconn=mysql.createConnection({ //主机地址 host:'127.0.0.1', //用户名 user:'root', //密码 password:'123456', //数据库 database:'test', //端口 port:3306, //字符集 charset:'utf8' }); //连接数据库 conn.connect(function(err){ if(err){ throwerr; } console.log('连接成功'); }); //插入数据,query()方法可以对sql语句进行参数绑定,用?号作为占位符。 conn.query('insertintotb_uservalues(null,?,?)',['xxx','xxx'],function(err,data){ if(err){ throwerr; } if(data&&data.affectedRows){ console.log('插入数据成功,id为',data.insertId); } }); //修改数据 conn.query('updatetb_usersetuser_name=?whereid=?',['ggg',7],function(err,data){ if(err){ throwerr; } if(data&&data.affectedRows){ console.log('修改数据成功'); } }); //删除数据 conn.query('deletefromtb_userwhereid=?',[5],function(err,data){ if(err){ throwerr; } if(data&&data.affectedRows){ console.log('删除数据成功'); } }); //关闭数据库连接 conn.end();
三、使用mysql连接池来优化对数据库的操作
频繁的连接和断开mysql是比较消耗资源的,我们可以创建一个连接池,复用连接池中的连接,提高效率。
constmysql=require('mysql'); //创建数据库连接池 letpool=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*fromtb_user',function(err,data){ if(err){ throwerr; } data.forEach(function(value){ console.log(value.id,value.user_name,value.addr); }); }); //当然我们也可以手动获取可用连接 pool.getConnection(function(err,conn){ if(err){ throwerr; } conn.query('select*from`order`',function(err,data){ if(err){ throwerr; } 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);
四、按流的方式进行查询
constmysql=require('mysql'); //创建数据库连接 letconn=mysql.createConnection({ //主机地址 host:'127.0.0.1', //用户名 user:'root', //密码 password:'123456', //数据库 database:'test', //端口 port:3306, //字符集 charset:'utf8' }); letquery=conn.query('select*fromtb_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()方法返回一个可读流来获取数据
constmysql=require('mysql'); //创建数据库连接 letconn=mysql.createConnection({ //主机地址 host:'127.0.0.1', //用户名 user:'root', //密码 password:'123456', //数据库 database:'test', //端口 port:3306, //字符集 charset:'utf8' }); //从一个查询中获取一个可读流 letqs=conn.query('select*fromtb_user').stream({highWaterMark:2}); letresult=[]; qs.on('data',function(data){ result.push(data); }); qs.on('end',function(){ console.log('查询结束'); console.log(result); }); conn.end();
五、mysql的事务处理
constmysql=require('mysql'); //创建数据库连接 letconn=mysql.createConnection({ //主机地址 host:'127.0.0.1', //用户名 user:'root', //密码 password:'123456', //数据库 database:'test', //端口 port:3306, //字符集 charset:'utf8' }); //连接数据库 conn.connect(function(err){ if(err){ throwerr; } console.log('连接成功'); }); //开启一个事务 conn.beginTransaction(function(err){ if(err){ throwerr; } conn.query('updateaccountsetmoney=money-50wherename=?',['A'],function(err,data){ if(err){ //如果有错误则回滚 returnconn.rollback(function(){ throwerr; }); } conn.query('updateaccountsetmoney=money+50wherename=?',['B'],function(err,data){ if(err){ //如果有错误则回滚 returnconn.rollback(function(){ throwerr; }); } //提交事务 conn.commit(function(err){ if(err){ //如果有错误则回滚 returnconn.rollback(function(){ throwerr; }); } console.log('处理成功'); conn.end(); }); }); }); });
六、解决mysql嵌套回调的问题
有些时候我们的操作需要上一个操作的结果,这样会导致比较深的嵌套问题,为了解决可以使用async和await来解决,而async和await又是基于promise的。
constmysql=require('mysql'); //创建数据库连接 letconn=mysql.createConnection({ //主机地址 host:'127.0.0.1', //用户名 user:'root', //密码 password:'123456', //数据库 database:'test', //端口 port:3306, //字符集 charset:'utf8' }); functionquery(conn,sql,params=[]){ if(!conn){ return; } returnnewPromise(function(resolve,reject){ conn.query(sql,params,function(err,data){ if(err){ reject(err); }else{ resolve(data); } }); }); } (asyncfunction(){ letresult=awaitquery(conn,'select*fromtb_user'); console.log(result); letrow=awaitquery(conn,'select*fromtb_userwhereid=?',[result[0].id]); console.log(row); conn.end(); })();
当然我们还可以使用util.promiseify()进行包装。
constmysql=require('mysql'); constutil=require('util'); //创建数据库连接 letconn=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); (asyncfunction(){ letresult=awaitconn.query('select*fromtb_user'); console.log(result); letrow=awaitconn.query('select*fromtb_userwhereid=?',[result[0].id]); console.log(row); conn.end(); })();
希望本文所述对大家node.js程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。