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