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