nodejs笔记(3)--mysql

来源:互联网 发布:sql内连接和外连接 编辑:程序博客网 时间:2024/06/07 01:20

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")    })//执行一条sqlconnection.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 success2connection 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!');          });        });      });    });
0 0
原创粉丝点击