nodejs中mysql使用

Node.js與MySQL交互操作有很多庫(kù)设塔,具體可以在 https://www.npmjs.com/package/mysql 查看。

安裝

npm install mysql

測(cè)試MySQL

自己下載mysql安裝就不說(shuō)明了远舅,很簡(jiǎn)單的壹置。
用官方的例子好了

var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});//創(chuàng)建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);
});//執(zhí)行sql語(yǔ)句
connection.end();//關(guān)閉鏈接

認(rèn)識(shí)一下Connection Options

要想創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,先就要認(rèn)識(shí)清楚Options

host:主機(jī)地址 (默認(rèn):localhost)
user:用戶名
password:密碼
port:端口號(hào) (默認(rèn):3306)
database:數(shù)據(jù)庫(kù)名
charset:連接字符集(默認(rèn):'UTF8_GENERAL_CI'表谊,注意字符集的字母都要大寫)
localAddress:此IP用于TCP連接(可選)
socketPath:連接到unix域路徑钞护,當(dāng)使用 host 和 port 時(shí)會(huì)被忽略
timezone:時(shí)區(qū)(默認(rèn):'local')
connectTimeout:連接超時(shí)(默認(rèn):不限制;單位:毫秒)
stringifyObjects:是否序列化對(duì)象(默認(rèn):'false' 爆办;與安全相關(guān)(https://github.com/felixge/node-mysql/issues/501)
typeCast:是否將列值轉(zhuǎn)化為本地JavaScript類型值 (默認(rèn):true)
queryFormat:自定義query語(yǔ)句格式化方法 (https://github.com/felixge/node-mysql#custom-format)
supportBigNumbers:數(shù)據(jù)庫(kù)支持bigint或decimal類型列時(shí)难咕,需要設(shè)此option為true (默認(rèn):false)
bigNumberStrings:supportBigNumbers和bigNumberStrings啟用 強(qiáng)制bigint或decimal列以JavaScript字符串類型返回(默認(rèn):false)
dateStrings:強(qiáng)制timestamp,datetime,data類型以字符串類型返回,而不是JavaScript Date類型(默認(rèn):false)
debug:開啟調(diào)試(默認(rèn):false)
multipleStatements:是否許一個(gè)query中有多個(gè)MySQL語(yǔ)句 (默認(rèn):false)
flags:用于修改連接標(biāo)志,更多詳情:(https://github.com/felixge/node-mysql#connection-flags)
ssl:使用ssl參數(shù)(與crypto.createCredenitals參數(shù)格式一至)或一個(gè)包含ssl配置文件名稱的字符串余佃,目前只捆綁Amazon RDS的配置文件

增暮刃、刪、改爆土、查

增椭懊、刪、改步势、查主要是sql語(yǔ)句來(lái)定的氧猬。

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

結(jié)束數(shù)據(jù)庫(kù)連接兩種方法和區(qū)別

前面的示例中我在結(jié)尾處都會(huì)調(diào)用一個(gè)connection.end()方法,這個(gè)方法connection.connect()對(duì)應(yīng),一個(gè)開始坏瘩,一個(gè)結(jié)束盅抚!
結(jié)束連接其實(shí)有兩種方法end(),destory()倔矾;

end()方法在queries都結(jié)束后執(zhí)行妄均,end()方法接收一個(gè)回調(diào)函數(shù)还棱,queries執(zhí)行出錯(cuò)丈甸,仍然后結(jié)束連接,錯(cuò)誤會(huì)返回給回調(diào)函數(shù)err參數(shù)垦巴,可以在回調(diào)函數(shù)中處理壤巷!

destory()比較暴力烫沙,沒(méi)有回調(diào)函數(shù),即刻執(zhí)行隙笆,不管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("進(jìn)行斷線重連:" + 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.連接池的創(chuàng)建升筏,使用createPool方法撑柔,options和createConntion一致,可以監(jiān)聽connection事件.
連接池會(huì)自動(dòng)斷線重連

var mysql = require('mysql');
//創(chuàng)建連接池
var pool = mysql.createPool({
host : '192.168.0.200',
user : 'root',
password : 'abcd'
});
//監(jiān)聽connection事件
pool.on('connection', function(connection) {
connection.query('SET SESSION auto_increment_increment=1');
});

連接池可以直接使用您访,也可以共享一個(gè)連接或管理多個(gè)連接(引用官方示例)

//直接使用
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.其它連接池配置選項(xiàng)

 waitForConnections
當(dāng)連接池沒(méi)有連接或超出最大限制時(shí)铅忿,設(shè)置為true且會(huì)把連接放入隊(duì)列,設(shè)置為false會(huì)返回error
  connectionLimit 連接數(shù)限制灵汪,默認(rèn):10
 queueLimit 最大連接請(qǐng)求隊(duì)列限制檀训,設(shè)置為0表示不限制,默認(rèn):0

3.釋放
  調(diào)用connection.release()方法享言,會(huì)把連接放回連接池峻凫,等待其它使用者使用!

其它...

1. escape()
防止SQL注入,可以使用pool.escape()和connect.escape()览露,不多說(shuō)了荧琼,自已可以試試

這樣使用 'SELECT * FROM userinfo WHERE id = ' + pool.escape('5 OR ID = 6')

2.escapeId()
如果不能信任SQL標(biāo)識(shí)符(數(shù)據(jù)庫(kù)名、表名、列名)命锄,可以使用轉(zhuǎn)換方法escapeId()堰乔;

類似這樣 'SELECT * FROM posts ORDER BY ' + connect.escapeId("date");

3.format()
可以使用mysql.format來(lái)準(zhǔn)備查詢語(yǔ)句,該函數(shù)會(huì)自動(dòng)的選擇合適的方法轉(zhuǎn)義參數(shù)脐恩。

var sql = "SELECT * FROM ? WHERE ? = ?";
var inserts = ['users', 'id', 123];
sql = mysql.format(sql, inserts);

4.自定義格式化函數(shù)

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" });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镐侯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驶冒,更是在濱河造成了極大的恐慌苟翻,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只怎,死亡現(xiàn)場(chǎng)離奇詭異袜瞬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)身堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門邓尤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贴谎,你說(shuō)我怎么就攤上這事汞扎。” “怎么了擅这?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵澈魄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仲翎,道長(zhǎng)痹扇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任溯香,我火速辦了婚禮鲫构,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玫坛。我一直安慰自己结笨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布湿镀。 她就那樣靜靜地躺著炕吸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勉痴。 梳的紋絲不亂的頭發(fā)上赫模,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音蒸矛,去河邊找鬼嘴瓤。 笑死扫外,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的廓脆。 我是一名探鬼主播筛谚,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼停忿!你這毒婦竟也來(lái)了驾讲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤席赂,失蹤者是張志新(化名)和其女友劉穎吮铭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颅停,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谓晌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癞揉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纸肉。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喊熟,靈堂內(nèi)的尸體忽然破棺而出柏肪,到底是詐尸還是另有隱情,我是刑警寧澤芥牌,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布烦味,位于F島的核電站,受9級(jí)特大地震影響壁拉,放射性物質(zhì)發(fā)生泄漏谬俄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一弃理、第九天 我趴在偏房一處隱蔽的房頂上張望溃论。 院中可真熱鬧,春花似錦案铺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至返吻,卻和暖如春姑子,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背测僵。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工街佑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谢翎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓沐旨,卻偏偏與公主長(zhǎng)得像森逮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磁携,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容