nodejs中mysql使用

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" });
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容