Node鏈接mysql數據庫方法

使用Node作Web開發,基本上都是使用NoSQL數據庫,最頻繁的就是使用MongoDB了,本身作了一些簡單的Web開發,爲了下降學習門檻,一直使用MySQL來作數據庫。這裏簡單介紹一下鏈接MySQL數據庫的方式,但願能幫助到其餘人。mysql

npm install --save mysql

使用上述命令安裝完MySQL的模塊後,就能夠直接使用了,官網的DOCS裏一個簡單的例子以下就能夠入門了。sql

var mysql = require('mysql');
var connection = mysql.createConnection({
  host: 'localhost',
  user: 'me',
  password : 'secret',
  database : 'my_db'
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;
  console.log('The solution is: ', rows[0].solution);
});
connection.end();

很簡單的一個例子,從上面的例子能夠得出:使用createConnection(option)方法建立一個鏈接對象,而後鏈接對象的connect()方法建立鏈接,最後使用query()方法執行SQL語句,返回結果做爲回調函數的參數rows返回,rows爲數組類型。mongodb

1. 鏈接

建立鏈接對象,須要傳入鏈接數據庫的一些鏈接參數,也就是createConnection(option)裏的optionoption是一個對象,以鍵值對的形式傳入createConnection()方法裏。上例列舉出了最基本的參數:數據庫

  • host 主機名npm

  • user 鏈接數據庫的用戶json

  • password 密碼數組

  • database 數據庫名稱函數

還有其餘的參數,能夠查詢下官方DOCS,這裏不一一列舉了,初期學習上面這些參數就足以。學習

2. 關閉

關閉一個鏈接使用end()方法,end()方法提供一個回調函數,以下:測試

connect.end(function(err){
    console.log('End a connection');
});

這是建議使用的方法,end()方法會等待鏈接回調完成後才關閉鏈接。官方還提供了另一種方法destroy()方法,這個方法直接關閉鏈接,不會等待回調完成。

舉個簡單的例子:

var mysql = require('mysql');
var option = require('./connect.js').option;
var conn = mysql.createConnection(option);
conn.query('select * from message',function(err,rows,fields){
  if(!err){
    console.log(rows);
  }
});
conn.end(function(err){
  console.log('end a connection');
});

最終結果會是:先打印完SELECT數據表結果後,再打印end a connection。而若是你將關閉方法換成conn.destroy();,那麼你就別想返回任何結果了,由於還沒等回調結束就已經終止鏈接了。

3. 鏈接池

鏈接池的原理是一開始就給你建立多個鏈接對象放在一個「池子」裏,用的時候取一個,用完了放回「池子」裏,在必定程度上是有利於節省系統開銷的,由於鏈接對象是在最開始的時候就建立好了,使用的時候再也不須要系統開銷去建立數據庫鏈接對象。官方DOCS介紹了鏈接方法:

var mysql = require('mysql');
var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bob',
  password        : 'secret',
  database        : 'my_db'
});
pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;
  console.log('The solution is: ', rows[0].solution);
});

建立鏈接池的方法是createPool(option)option裏多了一個參數connectionLimit指的是一次性在鏈接池裏建立多少個鏈接對象,默認10個。若是你想共享一個鏈接對象,可使用下面方法進行鏈接;

var mysql = require('mysql');
var pool  = mysql.createPool({
  host     : 'example.org',
  user     : 'bob',
  password : 'secret',
  database : 'my_db'
});
pool.getConnection(function(err, connection) {
  // Use the connection
  connection.query( 'SELECT something FROM sometable', function(err, rows) {
    // And done with the connection.
    connection.release();
    // Don't use the connection here, it has been returned to the pool.
  });

// Use the connection
  connection.query( 'SELECT something2 FROM sometable2', function(err, rows) {
    // And done with the connection.
    connection.release();
    // Don't use the connection here, it has been returned to the pool.
  });
});

使用一個鏈接對象執行兩次query()函數。

4. 示例1

使用基本的鏈接方式來鏈接數據庫,分別定義數據鏈接以及關閉的function,以下示例:

// connect.js 數據庫鏈接與關閉
var mysql = require('mysql');
var config = require('./config.json'); // 將數據庫鏈接參數寫入mysql對象,即config.mysql
var connCount = 0; // 統計目前未關閉的鏈接
exports.getConn = function(){
  connCount ++;
  console.log('............................OPEN a connection, has '+ connCount + ' connection.');
  return mysql.createConnection(config.mysql);
};
exports.endConn = function(conn){
  conn.end(function(err){
    if(!err){
      connCount --;
      console.log('.........................CLOSE a connection, has '+ connCount + ' connection.');
    }
  });
};

而後給個使用數據庫的示例,

// db.js 查詢用戶信息
var connect = require('./connect.js'); // 引入數據鏈接方法
exports.getUser = function(username, callback){
    var connection = connect.getConn();
    var sql = 'select * from user where username = "' + username + '"';
    connection.query(sql,function(err,rows,fields){
        callback(err,rows,fields);    
    });
    connect.endConn(connection);
}

5. 示例2

使用數據庫鏈接池,一樣先建立數據庫鏈接池的方法,以下兩種方式:

// connect.js 直接使用
var mysql = require('mysql');
var config = require('./config.json');
var pool = mysql.createPool(config.mysql);

exports.querySQL = function(sql,callback){
    pool.query(sql, function(err,rows,fields){
        callback(err,rows,fields);
    });
}
// connect.js 使用getConnection方法
var mysql = require('mysql');
var config = require('./config.json');
var pool = mysql.createPool(config.mysql);

exports.querySQL = function(sql, callback){
    pool.getConnection(function(err,conn){
        conn.query(sql,function(err,rows,fields){
            callback(err,rows,fields); 
            conn.release();   // 不要忘了釋放
        });        
    });
}

使用的時候,直接使用querySQL方法便可,以下:

// db.js 查詢用戶信息
var connect = require('./connect.js');
exports.getUser = function(username,callback){
    var sql = 'select * from user where username = "' + username + '"';
    connect.querySQL(sql,function(err,rows,fields){
        callback(err,rows,fields);        
    });
};

官方是推薦使用鏈接池的方式進行鏈接的,可是,是直接使用pool.query()鏈接仍是pool.getConnection()的方法來鏈接,官方並無介紹其優劣,我簡單作了個測試,貌似這兩種方式並無多大的區別,也就沒再研究,有知道的煩請告知,謝了~


相關文章
相關標籤/搜索