视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
nodejs中如何操作mysql并使用(附代码)
2020-11-27 19:32:24 责编:小采
文档


本篇文章给大家带来的内容是关于nodejs中如何操作mysql并使用(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

安装

npm install mysql

测试MySQL

自己下载mysql安装就不说明了,很简单的。
用官方的例子好了

var mysql = require(‘mysql’); 
 var connection = mysql.createConnection({ 
 host : ‘localhost’, 
 user : ‘me’, 
 password : ‘secret’, 

 database : ‘my_db’ 

 });//创建mysql链接 

 connection.connect(); 

 connection.query(‘SELECT 1 + 1 AS solution’, function (error, results, fields) { 

 if (error) throw error; 

 console.log(‘The solution is: ‘, results[0].solution); 

 });//执行sql语句 

 connection.end();//关闭链接
认识一下Connection Options

要想创建一个数据库连接,先就要认识清楚Options

  host:主机地址 (默认:localhost) 

 user:用户名 

 password:密码 

 port:端口号 (默认:3306) 

 database:数据库名 

 charset:连接字符集(默认:’UTF8_GENERAL_CI’,注意字符集的字母都要大写) 

 localAddress:此IP用于TCP连接(可选) 

 socketPath:连接到unix域路径,当使用 host 和 port 时会被忽略 

 timezone:时区(默认:’local’) 

 connectTimeout:连接超时(默认:不;单位:毫秒) 

 stringifyObjects:是否序列化对象(默认:’false’ ;与安全相关(https://github.com/felixge/node-mysql/issues/501) 

 typeCast:是否将列值转化为本地JavaScript类型值 (默认:true) 

 queryFormat:自定义query语句格式化方法 (https://github.com/felixge/node-mysql#custom-format) 

 supportBigNumbers:数据库支持bigint或decimal类型列时,需要设此option为true (默认:false) 

 bigNumberStrings:supportBigNumbers和bigNumberStrings启用 强制bigint或decimal列以JavaScript字符串类型返回(默认:false) 

 dateStrings:强制timestamp,datetime,data类型以字符串类型返回,而不是JavaScript Date类型(默认:false) 

 debug:开启调试(默认:false) 

 multipleStatements:是否许一个query中有多个MySQL语句 (默认:false) 

 flags:用于修改连接标志,更多详情:(https://github.com/felixge/node-mysql#connection-flags) 

 ssl:使用ssl参数(与crypto.createCredenitals参数格式一至)或一个包含ssl配置文件名称的字符串,目前只捆绑Amazon RDS的配置文件

增、删、改、查

增、删、改、查主要是sql语句来定的。

1、增加
var userAddSql = ‘INSERT INTO userinfo(Id,UserName,UserPass) VALUES(0,?,?)’; 

 var userAddSql_Params = [‘Wilson’, ‘abcd’]; 

 connection.query(userAddSql,userAddSql_Params,function (err, result) { 

 … 

 });
2、删除
var userModSql = ‘DELETE FROM userinfo’; 

 connection.query(userModSql,function (err, result) { 

 … 

 });
3、修改
var userModSql = ‘UPDATE userinfo SET UserName = ?,UserPass = ? WHERE Id = ?’; 

 var userModSql_Params = [‘钟慰’, ‘5678’,1]; 

 connection.query(userModSql,userModSql_Params,function (err, result) { 

 … 

 });
4.查询
var userGetSql = ‘SELECT * FROM userinfo’; 

 connection.query(userGetSql ,function (err, result) { 

 … 

 });

结束数据库连接两种方法和区别

  前面的示例中我在结尾处都会调用一个connection.end()方法,这个方法connection.connect()对应,一个开始,一个结束!
结束连接其实有两种方法end(),destory();

  end()方法在queries都结束后执行,end()方法接收一个回调函数,queries执行出错,仍然后结束连接,错误会返回给回调函数err参数,可以在回调函数中处理!

  destory()比较暴力,没有回调函数,即刻执行,不管queries是否完成!

断线重连

var mysql = require(‘mysql’); 

 var db_config = { 

 host : ‘192.168.0.200’, 

 user : ‘root’, 

 password : ‘abcd’, 

 port: ‘3306’, 

 database: ‘nodesample’ 

 }; 

 var connection; 

 function handleDisconnect() { 

 connection = mysql.createConnection(db_config); 

 connection.connect(function(err) { 

 if(err) { 

 console.log(“进行断线重连:” + new Date()); 

 setTimeout(handleDisconnect, 2000); //2秒重连一次 

 return; 

 } 

 console.log(“连接成功”); 

 }); 

 connection.on(‘error’, function(err) { 

 console.log(‘db error’, err); 

 if(err.code === ‘PROTOCOL_CONNECTION_LOST’) { 

 handleDisconnect(); 

 } else { 

 throw err; 

 } 

 }); 

 } 

 handleDisconnect();

sql链接池Pooling connections

1.连接池的创建,使用createPool方法,options和createConntion一致,可以监听connection事件.
连接池会自动断线重连

var mysql = require(‘mysql’); 

 //创建连接池 

 var pool = mysql.createPool({ 

 host : ‘192.168.0.200’, 

 user : ‘root’, 

 password : ‘abcd’ 

 }); 

 //监听connection事件 

 pool.on(‘connection’, function(connection) { 

 connection.query(‘SET SESSION auto_increment_increment=1’); 

 }); 

 

 连接池可以直接使用,也可以共享一个连接或管理多个连接(引用官方示例) 

 //直接使用 

 pool.query(‘SELECT 1 + 1 AS solution’, function(err, rows, fields) { 

 if (err) throw err; 

 console.log(‘The solution is: ‘, rows[0].solution); 

 }); 

 //共享 

 pool.getConnection(function(err, connection) { 

 // connected! (unless err is set) 

 });

2.其它连接池配置选项

waitForConnections
当连接池没有连接或超出最大时,设置为true且会把连接放入队列,设置为false会返回error
connectionLimit 连接数,默认:10
queueLimit 最大连接请求队列,设置为0表示不,默认:0

  
3.释放
  调用connection.release()方法,会把连接放回连接池,等待其它使用者使用!

其它…

1. escape()
防止SQL注入,可以使用pool.escape()和connect.escape(),不多说了,自已可以试试

这样使用 ‘SELECT * FROM userinfo WHERE id = ’ + pool.escape(‘5 OR ID = 6’)

2.escapeId()
如果不能信任SQL标识符(数据库名、表名、列名),可以使用转换方法escapeId();

类似这样 ‘SELECT * FROM posts ORDER BY ’ + connect.escapeId(“date”);

3.format()
可以使用mysql.format来准备查询语句,该函数会自动的选择合适的方法转义参数。

var sql = “SELECT * FROM ? WHERE ? = ?”; 

 var inserts = [‘users’, ‘id’, 123]; 

 sql = mysql.format(sql, inserts);

4.自定义格式化函数

connection.config.queryFormat = function (query, values) {
 if (!values) return query;
 return query.replace(/:(\w+)/g, function (txt, key) {
 if (values.hasOwnProperty(key)) {
 return this.escape(values[key]);
 }
 return txt;
 }.bind(this));
};
connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });

下载本文
显示全文
专题