在node中操作mysql小記
學習到需要接觸數(shù)據(jù)庫的時候悠栓,開始使用的是通過mongoose操作的mongodb殉了,而且并沒有配置本地的mongodb,而是用的云端托管的mongolab,作為一個小白,簡單的mongoose操作還行鹉动,不求甚解式的去儲存數(shù)據(jù)讀取數(shù)據(jù),但為什么要這樣做宏邮,以及除了這樣做還能怎樣做,我便一無所知蜜氨。想來想去,我決定先還是把mongodb放一放记劝,先仔細了解下mysql再說族扰,畢竟手上有一本sql必知必會厌丑。
這本書當然不錯,講得很詳細渔呵,但那只是操作mysql的sql語句,我想了解下node中是如何操作mysql扩氢,或者說在node中如何與mysql等數(shù)據(jù)庫關(guān)聯(lián)的?在node.js連接mysql的過程录豺,我們通常有兩種連接方法朦肘,普通連接和連接池饭弓。我這里只有對普通連接的小結(jié):
下邊是我的一些小結(jié):
1、安裝mysql組件:
npm install mysql
2媒抠、在node中運行第一個mysql查詢:
var mysql = require('mysql');
var connection = mysql.createConnection({
(
host: 'localhost',
user: 'root',
password: 'your password',
database: 'usersdata'
)
});
connection.connect();
var queryString = '在這里輸入你要使用的sql語句';
connection.query(queryString,function(err,rows,fields) {
if(err) {
throw err;
}
//在這里輸入你要進行的操作
});
connection.end();
注意:除此之外趴生,你還可以將連接選項(connection options)作為一個單一的字符串而不是一個對象插入進去。
執(zhí)行查詢
最簡單的執(zhí)行查詢操作就是調(diào)用connection或pool對象的實例的.query( )方法苍匆。調(diào)用.query()方法可以有三種不同的形式,下面是最簡單的一種:
connection.query('mysql查詢字符串',function(err,results,fields) {
//執(zhí)行操作
});
注意:query()方法的第二個參數(shù)是一個回調(diào)函數(shù)叔汁,它的三個參數(shù)分別代表著不同的含義:
- 在查找過程中,如果出錯返回的Error
- results包含查找的結(jié)果
- fields包含返回結(jié)果的字段信息
connection對象的query方法需要一個回調(diào)函數(shù)攻柠,當回調(diào)函數(shù)中的三個參數(shù)任意一個結(jié)束后后裸,該函數(shù)會被執(zhí)行,在上例子中回調(diào)函數(shù)為一名函數(shù)function()微驶。
上面的代碼中定義了一個會將結(jié)果作為一個單一的數(shù)據(jù)流返回的匿名函數(shù)。但是苟耻,如果table有數(shù)量非常多的rows,同時你想當每個row但會時對其單獨處理凶杖,而不是等待著去搜集所有的rows款筑,你可以將上面的代碼改成如下這樣:
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'your password',
database: 'usersdata'
});
connection.connect();
var query = connection.query('在這里輸入你的sql操作語句');
query.on('error',function(err) {
throw err;
});
query.on('fields',function(fields) {
console.log(fields);
});
query.on('result',function(row) {
console.log(row.user_name);
});
connection.end();
注意:上面的代碼中每當有一行數(shù)據(jù)返回時將其寫入console。如果因為某些原因你需要在每一行數(shù)據(jù)返回前去處理他們杈湾,你不得不去暫停query攘须,當你的那些操作完成后再去回復它漆撞。
query.on('result',function(row) {
connection.pause();
//你可以在這里進行一些操作
console.log(row);
connection.resume();
});
對query的值進行隱碼
為了避免sql的隱碼攻擊,你可以運行quey之前浮驳,對用戶數(shù)據(jù)進行隱藏。下面有兩種方法至会,第一種使用?操作符:
var mysql = require('mysql');
var connection = mysql.createConnection({
//略
});
var key = '_edit_lock';
var queryString = 'SELECT * FROM usersdata WHERE meta_key = ?';
connection.query(queryString,[key],function(err,rows,fields) {
if(err) {
throw err;
}
for(var i in rows) {
console.log(rows[i]);
}
});
connection.end();
另外一種方式是使用 connection.escape( )方法:
var mysql = require('mysql');
var connection = mysql.createConnection({
//略
});
var key = '_edit_lock';
var queryString = 'SELECT * FROM usersdata WHERE meta_key = ' + connection.escape(key);
connection.query(queryString,function(err,rows,fields) {
if(err) {
throw err;
}
for(var i in rows) {
console.log(rows[i]);
}
});
獲得插入行的id
如果你向表格中插入了一個有自動遞增的主鍵的行的話健霹,你可以通過下面的寫法來重新獲得這個插入行的id:
connection.query('INSERT INTO posts SET ?',{title:'test'},function(err,result) {
if(err) {
throw err;
}
console.log(result.insertId);
})
獲取affected rows的數(shù)量
當進行查詢過程中瓶蚂,會在數(shù)據(jù)庫中對相應的行進行遍歷查找,通過以下的方法可以在插入瞳别、更新杭攻、刪除語句中獲得受影響的行數(shù):
connection.query('DELETE FORM posts WHERE title = "wrong"',function(err,result) {
if(err) {
throw err;
}
console.log('deleted' + result.affectedRows + 'rows');
});
獲取被改變行的數(shù)量
通過result.changedRows這個屬性來獲得:
changedRows 不同于 affectedRows的點在于它不包括更新行的數(shù)量,因為更新行的值并沒有被改變兆解。
connection.query('UPDATE posts SET...',function(err,result) {
if(err) {
throw err;
}
console.log('changed' + result.changedRows + 'rows');
});
其他的一些小方法:
- 獲得連接的id:通過connection.threadId來獲得給定連接的id。
(未完待續(xù)埠巨,等我實際用到哪些地方的時候再填上)
中斷連接
通過指令來關(guān)閉連接的方法有兩種:
1现拒、 調(diào)用connection的end()方法:
connection.end(function(err) {
//
});
2、調(diào)用destroy()方法:
connection.destroy(function(err) {
//
});
后者會對潛在的套接(underlying socket)造成立即的終止印蔬,且會確保在這之后不會有任何的事件或函數(shù)為連接而觸發(fā)。
中斷重連
mysql的連接可能因為一個錯誤意外的關(guān)閉例驹,此外你可以通過相應的指令來明確的關(guān)閉連接陵究。如果你的關(guān)閉是因為一些錯誤意外造成的話,那么你需要去解決這個錯誤铜邮,如果需要請重新打開它;
重連connection的本質(zhì)實際上是重新建立一個連接扔茅。連接一旦斷開秸苗,從設計角度講師不能被真正的重新連接的。
connection.on('close',function(err) {
if(err) {
//連接意外中斷惊楼,重新連接
connection = mysql.createConnection(connection.config();
} else {
console.log('conneciton closed normally')
}
});
注意: connection.config 對象保存著最近的鏈接信息,你可以通過它重新連接到mysql服務器雅倒。嘗試著將 connection.config 添加到console.log()中弧可,會返回以下信息:
{
host: 'localhost',
port: 3306,
socketPath: undefined,
user: 'sam',
password: 'some-pass',
database: 'usersdata',
insecureAuth: false,
debug: undefined,
typeCast: true,
maxPacketSize: 0,
charsetNumber: 33,
clientFlags: 193487
}
最后附上mysql的README:https://github.com/mysqljs/mysql