要对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();
})();

  

node.js中对 mysql 进行增删改查等操作和async,await处理的更多相关文章

  1. MySQL常用增删改查等操作语句

    修改数据库的字符集    mysql>use mydb    mysql>alter database mydb character set utf8;创建数据库指定数据库的字符集    ...

  2. js中实现cookie的增删改查(document.cookie的使用详情)

    一.设置cookie的值 1.每个cookie都是一个名称/值对,名称/值对用等号连接,并将该名称/值对赋值给document.cookie即可.如:document.cookie="id= ...

  3. koa+mysql实现增删改查-全栈之路(001)

    Date: 2020-4-23 以前很少写文章,从今天开始我要挑战一下自己,连续输出100篇技术类文章.这100篇文章我尽量以实战案例为主. 如果你觉得本文还不错,记得关注或者给个 star,你们的赞 ...

  4. MVC3.0+knockout.js+Ajax 实现简单的增删改查

    MVC3.0+knockout.js+Ajax 实现简单的增删改查 自从到北京入职以来就再也没有接触MVC,很多都已经淡忘了,最近一直在看knockout.js 和webAPI,本来打算采用MVC+k ...

  5. MySQL之增删改查

    前言:以下是MySQL最基本的增删改查语句,很多IT工作者都必须要会的命令,也是IT行业面试最常考的知识点,由于是入门级基础命令,所有所有操作都建立在单表上,未涉及多表操作. 前提:在进行" ...

  6. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  7. MySQL数据库(增删改查语句)

    MySQL数据库(增删改查语句)一.登录数据库:---->  mysql -uroot -proot;(对应用户名和密码)二.SQL语句:    数据定义语言DDL  用来定义数据库.表.列,关 ...

  8. python操作mysql数据库增删改查的dbutils实例

    python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...

  9. 在ASP.NET MVC4中实现同页面增删改查,无弹出框02,增删改查界面设计

    在上一篇"在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建"中,已经搭建好了Repository层,本篇就剩下增删改查的界面了......今 ...

随机推荐

  1. Three failed attempts of handling non-sequential data

    The Progress of Products Classification Cause now we are considering to classify the product by two ...

  2. 微信公众号生成带参数的二维码asp源码下载

    晚上闲着没事,一个朋友联系,让帮忙写一个微信公众号利用asp生成带参数的二维码,别人扫了后如果已经关注过该公众号的,则直接进入公众号里,如果没关注则提示关注,关注后自动把该微信用户资料获取到并且保存入 ...

  3. PHP URL安全的Base64位编码

    先将内容编码成Base64结果; 将结果中的加号”+”替换成中划线“-“; 将结果中的斜杠”/”替换成下划线”_”; 将结果中尾部的“=”号全部保留; 实现 编码 function urlsafe_b ...

  4. peewee 通俗易懂版

    Peewee作为Python ORM之一 优势:简单,小巧,易学习,使用直观 不足之处:需要手动创建数据库 基本使用流程 1⃣️根据需求定义好Model(表结构类) 2⃣️通过create_table ...

  5. LINUX新建和增加SWAP分区

    我们都知道在安装Linux系统时在分区时可以分配swap分区,而系统安装后(在运行中)如何建立或调整swap分区呢? 在装完Linux系统之后,建立Swap分区有两种方法. 1.新建磁盘分区作为swa ...

  6. 开源微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器

    JeeWx捷微4.0   微服务版本发布^_^ 换代产品(全新架构,全新UI,提供强大的图文编辑器) JEEWX 从4.0版本开始,技术架构全新换代,采用微服务架构,插件式开发,每个业务模块都是独立的 ...

  7. CentOS7.0 采用压缩包 安装Nginx 1.7.4和添加Tomcat为系统服务 nginx结合tomcat

    CentOS7.0 采用压缩包 安装Nginx 1.7.4  一.安装准备首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc ...

  8. JAVA设计方法思考之如何实现一个方法执行完毕后自动执行下一个方法

    今天编程时,突然想起来在一些异步操作或Android原生库的时候,需要我们实现一些方法, 这些方法只需要我们具体实现,然后他们会在适当的时候,自动被调用! 例如AsyncTask,执行玩doInBac ...

  9. jquery遍历----end()方法

    定义和用法 end() 方法结束当前链条中的最近的筛选操作,并将匹配元素集还原为之前的状态. 举个栗子: <body> <ul class="first"> ...

  10. 转载——JavaScript学习笔记:取数组中最大值和最小值

    转载自:http://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html. 取数组中最大值 可以先把思路 ...