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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。