mysql模块详解

mysql是Nodejs下比较有名的一个MySQL操作模块。
下面是一个简单的创建mysql数据库的连接

var conn = mysql.createConnection({
    host: settings.host,
    user: settings.user,
    password: settings.password,
    database: settings.database,
    port: settings.port
});

conn.connect();

然后可以通过conn来执行查询操作

var sql = 'select * from test';
conn.query(sql, function(err, rows) {
    if (err) throw err;
    console.log(rows);
});

也可以执行更新和插入操作

sql = 'insert into ?test(name) value ("张三")';
conn.query(sql, [table,name] ,function(err, info) {
    if (err) throw err;
    console.log(info.affectedRows);
    console.log(info.insertId);
});

这里的affectedRows是操作后表受影响的行数,可以用来判断是否更新或操作成功
insertId可以得到插入记录的自增ID

最后需要关闭连接

conn.end();

如果网络问题或者MySQL服务器重启或者超过一段时间没操作,MySQL会主动断开连接,这是需要监听这个事件,重新连接数据库

function handleDisconnect() {
    conn = mysql.createConnection({
        host: settings.host,
        user: settings.user,
        password: settings.password,
        database: settings.database,
        port: settings.port
    });
    conn.connect(function(err) {
        if (err) {
            console.log('连接数据库出错:' + err);
            setTimeout(handleDisconnect, 2000);
        }
    });
    
    conn.on('error',function(err){
        console.log('出错:'+err);
        if(err.code == 'PROTOCOL_CONNECTION_LOST'){
            handleDisconnect();
        }else{
            throw err;
        }
    });
}

handleDisconnect();

为了防止遭受SQL注入攻击,可以对标识符和字符串进行转义操作

var colunms = ['id','name'];
var sql = 'select ?? from test';
conn.query(sql,[colunms], function(err, rows) {
    if (err) throw err;
    console.log(rows);
});

var name = '李四';
var table = 'test';
sql = 'insert into ??(name) value ("?")';
conn.query(sql, [table,name] ,function(err, info) {
    if (err) throw err;
    console.log(info.affectedRows);
    console.log(info.insertId);
});

标识符用 ?? 或者 mysql.escapeID()
字符串用 ? 或者conn.escape()

实际应用中,往往需要同时发起多个数据库查询,如果只建立一个数据库连接,那查询就会进入等待队列,所以需要一个连接池来管理多个数据库的连接

var pool = mysql.createPool({
    host: settings.host,
    user: settings.user,
    password: settings.password,
    database: settings.database,
    port: settings.port,
    connectionLimit: 10
});

pool.getConnection(function(err,connection){
    if(err) throw err;
    // connection 为当前一个可用的数据库连接
});

connectionLimit 最大连接数,默认为10

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容