node与Mysql
安装mysql模块
npm install mysql
按照官方案例做个demo:
var mysql = require("mysql");
//建立一个连接
var connection = mysql.createConnection({
host : '192.168.28.205',
user : 'root',
password: '123456',
port:'3306',
database:'test'
});
//建立连接
connection.connect(
function(err){
if(err){
console.log(err);
return;
}
console.log("connection success")
}
)
//执行一条sql
connection.query('select 1+1 as anwser',function(err,rows,fields){
if(err)throw err;
console.log('The anwser is: ', rows[0].anwser);
})
//关闭连接
connection.end(
function(err){
if(err){
console.log(err);
return;
}
console.log("connection end")
}
)
输出
connection success
2
connection end
继续深入,增删改查:
var mysql = require("mysql");
//建立一个连接
var connection = mysql.createConnection({
host : '192.168.28.205',
user : 'root',
password: '123456',
port:'3306',
database:'test'
});
//建立连接
connection.connect()
//执行一条sql
/*connection.query('select 1+1 as anwser',function(err,rows,fields){
if(err)throw err;
console.log('The anwser is: ', rows[0].anwser);
})*/
//增删改查
var sqlState1 = "insert into node_test(name,id,job) values(?,?,?)";
var sqlState2 = "update node_test set name=? , job = ? where id = ?";
var sqlState3 = "select *from node_test where id = ?";
var sqlState4 = "delete from node_test where id = ?";
var param1 = ["bonita","0","student"];
var param2 = ["tom","engineer","0"];
var param3 = "0";
connection.query(sqlState1,param1,function(err,result){
if(err) throw err;
console.log(result);
});
//关闭连接
connection.end()
结束数据库连接end()和destroy()
end()接受一个回调函数,并且会在query结束之后才触发,如果query出错,仍然会终止链接,错误会传递到回调函数中处理。
destroy()立即终止数据库连接,即使还有query没有完成,之后的回调函数也不会在触发
连接池:
var mysql = require("mysql");
//建立一个连接池
var pool = mysql.createPool({
host:'192.168.28.205',
port:'3306',
user:'root',
password:'123456',
database:'test'
})
//管理连接池
function getPoolCon(sql) {
pool.getConnection(function(err,connection){
if(!connection || err){
console.log(err);
return;
}
connection.query(sql,function(err,result){
if(err)throw err;
console.log(result);
connection.release();//释放连接
});
/*connection.query("select * from node_test",function(err,result){
if(err)throw err;
console.log(result);
connection.release();
});*/ //这里错误了,应该重新去连接池获取新的连接
})
}
getPoolCon("select * from node_test")
重新建立连接:
var mysql = require("mysql");
//建立一个连接
var connection = mysql.createConnection({
host : '192.168.28.205',
user : 'root',
password: '123456',
port:'3306',
database:'test'
});
function getConnect(){
connection.connect(function(err){
if(err){
console.log("建立连接失败:",err);
setTimeout(getConnect, 2000);
}else{
console.log("connect success")
}
});
// 如果是连接断开,自动重新连接
connection.on("error",function(err){
if(err.code === 'PROTOCOL_CONNECTION_LOST'){
getConnect();
}else{
throw err;
}
})
}
getConnect();
连接池集群技术:
连接池集群可以提供多个主机连接
//创建连接池集群
var poolCluster = mysql.createPoolCluster();
//添加配置 config是一个连接池配置
poolCluster.add(config);//使用自动名称添加配置
poolCluster.add('MASTER',masterConfig);//添加命名配置
poolCluster.add('SLAVE1',slave1config);
poolCluster.add('SLAVE2',slave2config);
//删除配置
poolCluster.remove('SLAVE1');//根据配置名字
poolCluster.remove('SLAVE*')//根据匹配到的
//获取连接 从所有的连接池里获得 默认选择器
poolCluster.getConnectiuon(function(err,connection){});
//从 一个连接池里面获取连接
poolCluster.getConnectiuon('MASTER',function(err,connection){});
//从匹配到的连接池组里面获取连接 按照顺序
//如果SLAVE1出错 就从SLAVE2获得连接
poolCluster.getConnectiuon('SLAVE*','ORDER',function(err,connection){} );
//触发事件 当删除连接池时触发
poolCluster.on('remove',function(nodeId){
console.log(nodeId);//被删除的连接池名字
});
//配置 选择器 从SLAVE1 SLAVE2 里面随机获得连接
var pool = poolCluster.of('SLAVE*','RANDOM');
pool.getConnectiuon(function(err,connection){});
//关闭连接池集群
poolCluster.end();
切换用户/改变连接状态:
参数
user: 新的用户 (默认为早前的一个).
password: 新用户的新密码 (默认为早前的一个).
charset: 新字符集 (默认为早前的一个).
database: 新数据库名称 (默认为早前的一个).
connection.changeUser({user : 'john'}, function(err) {
if (err) throw err;
});
为了避免SQL注入攻击,需要转义用户提交的数据。可以使用connection.escape() 或者 pool.escape()
或者使用占位符?
可以使用??作为标识符的占位符
var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function(err, results) {
// ...
});
var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) {
// ...
});
事务处理:
connection.beginTransaction(function(err) {
if (err) { throw err; }
connection.query('INSERT INTO posts SET title=?', title, function(err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
var log = 'Post ' + result.insertId + ' added';
connection.query('INSERT INTO log SET data=?', log, function(err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('success!');
});
});
});
});