美文网首页
nodejs中mysql使用

nodejs中mysql使用

作者: go含羞草 | 来源:发表于2017-09-07 21:18 被阅读0次

    Node.js与MySQL交互操作有很多库,具体可以在 https://www.npmjs.com/package/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" });

    相关文章

      网友评论

          本文标题:nodejs中mysql使用

          本文链接:https://www.haomeiwen.com/subject/xaypjxtx.html