在node或express使用mysql

在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ù)分別代表著不同的含義:

  1. 在查找過程中,如果出錯返回的Error
  2. results包含查找的結(jié)果
  3. 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');
    });

其他的一些小方法:

  1. 獲得連接的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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市裁良,隨后出現(xiàn)的幾起案子校套,更是在濱河造成了極大的恐慌,老刑警劉巖笛匙,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異座硕,居然都是意外死亡涕蜂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門蜘拉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來有鹿,“玉大人旭旭,你說我怎么就攤上這事葱跋≡此螅” “怎么了稍味?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵模庐,是天一觀的道長烛愧。 經(jīng)常有香客問我掂碱,道長,這世上最難降的妖魔是什么沧卢? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任悴了,我火速辦了婚禮,結(jié)果婚禮上湃交,老公的妹妹穿的比我還像新娘。我一直安慰自己息罗,他們只是感情好才沧,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挨摸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪得运。 梳的紋絲不亂的頭發(fā)上锅移,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音非剃,去河邊找鬼。 笑死券坞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的报慕。 我是一名探鬼主播压怠,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼菌瘫,長吁一口氣:“原來是場噩夢啊……” “哼蜗顽!你這毒婦竟也來了雨让?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤崔挖,失蹤者是張志新(化名)和其女友劉穎庵寞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捐川,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡古沥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩齿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡龄章,死狀恐怖襟诸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歌亲,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布惋鸥,位于F島的核電站,受9級特大地震影響卦绣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜廊蜒,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一溅漾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧添履,春花似錦、人聲如沸暮胧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炼绘。三九已至,卻和暖如春俺亮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脚曾。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工本讥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留七芭,地道東北人夜畴。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓跟伏,卻偏偏與公主長得像秧了,于是被迫代替她去往敵國和親序无。 傳聞我的和親對象是個殘疾皇子衡创,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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

  • 1. Java基礎部分 基礎部分的順序:基本語法晶通,類相關(guān)的語法,內(nèi)部類的語法一也,繼承相關(guān)的語法,異常的語法塘秦,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎(第2版) 姜承堯 第1章 MySQL體系結(jié)構(gòu)和存儲引擎 >> 在上述例子...
    沉默劍士閱讀 7,417評論 0 16
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應用程序爪幻。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建挨稿,訪問,管理...
    chen_000閱讀 4,035評論 0 19
  • 模塊Github地址 安裝 如果需要以前的版本0.9.x系列的文檔篷店,請訪問v0.9 branch.有時你可以從gi...
    明明三省閱讀 6,227評論 1 24
  • 突然變得很不想睡覺臭家,時間變得很長,黑夜中的心跳和時鐘一個頻率钉赁,急促而又緩慢。 失眠往往讓人痛苦不堪你踩,在安靜的夜里,...
    文藝的大頭閱讀 280評論 0 0