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! (unlesserr
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" });