mysql模塊詳解

mysql是Nodejs下比較有名的一個MySQL操作模塊。
下面是一個簡單的創(chuàng)建mysql數(shù)據(jù)庫的連接

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

conn.connect();

然后可以通過conn來執(zhí)行查詢操作

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

也可以執(zhí)行更新和插入操作

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是操作后表受影響的行數(shù),可以用來判斷是否更新或操作成功
insertId可以得到插入記錄的自增ID

最后需要關(guān)閉連接

conn.end();

如果網(wǎng)絡(luò)問題或者M(jìn)ySQL服務(wù)器重啟或者超過一段時間沒操作,MySQL會主動斷開連接,這是需要監(jiān)聽這個事件,重新連接數(shù)據(jù)庫

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('連接數(shù)據(jù)庫出錯:' + err);
            setTimeout(handleDisconnect, 2000);
        }
    });
    
    conn.on('error',function(err){
        console.log('出錯:'+err);
        if(err.code == 'PROTOCOL_CONNECTION_LOST'){
            handleDisconnect();
        }else{
            throw err;
        }
    });
}

handleDisconnect();

為了防止遭受SQL注入攻擊,可以對標(biāo)識符和字符串進(jìn)行轉(zhuǎn)義操作

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);
});

標(biāo)識符用 ?? 或者 mysql.escapeID()
字符串用 ? 或者conn.escape()

實際應(yīng)用中,往往需要同時發(fā)起多個數(shù)據(jù)庫查詢,如果只建立一個數(shù)據(jù)庫連接,那查詢就會進(jìn)入等待隊列,所以需要一個連接池來管理多個數(shù)據(jù)庫的連接

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 為當(dāng)前一個可用的數(shù)據(jù)庫連接
});

connectionLimit 最大連接數(shù),默認(rèn)為10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容