安裝
$ cnpm i mysql
介紹
mysql
模塊是Node.js的mysql驅(qū)動,由JavaScript編寫,不需要編繹,并且完全開源。
示例
首先創(chuàng)建測試用的數(shù)據(jù)庫與數(shù)據(jù)表:
mysql> CREATE DATABASE my_db;
Query OK, 1 row affected (0.00 sec)
mysql> USE my_db;
Database changed
mysql> CREATE TABLE users(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> name VARCHAR(30) NOT NULL,
-> age TINYINT UNSIGNED NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT users VALUES(NULL, 'Jack', 22);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT users VALUES(NULL, 'ROSE', 20);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM users;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Jack | 22 |
| 2 | ROSE | 20 |
+----+------+-----+
2 rows in set (0.00 sec)
在Node.js中使用mysql:
// app.js
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'my_db'
});
connection.connect();
connection.query('SELECT * FROM users', function(err, results, fields) {
if (err) throw err;
console.log(results);
});
connection.end();
輸出結(jié)果如下:
connected as id 1
[ RowDataPacket { id: 1, name: 'Jack', age: 22 },
RowDataPacket { id: 2, name: 'ROSE', age: 20 } ]
建立連接
推薦通過下面的方式建立連接:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'example.org',
user : 'bob',
password : 'secret'
});
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
常用連接選項有:
-
host
: 主機名 -
port
: 端口(可選,默認(rèn)為3306) -
user
: 用戶名 -
password
: 密碼 -
database
: 數(shù)據(jù)庫(可選)
終止連接
有兩種方式實現(xiàn)終止MySQL連接。通過end()
方法優(yōu)雅終止:
connection.end(function(err) {
// The connection is terminated now
});
通過destroy()
方法立即終止(沒有回調(diào)):
connection.destroy();
連接池連接
除了創(chuàng)建和管理逐個的連接,此模塊還提供了一個內(nèi)建的連接池,通過mysql.createPool(config)
方式使用。
為什么為使用數(shù)據(jù)庫連接池?百度百科上是這么寫的:
數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
使用連接池:
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: 'root',
database: 'my_db'
});
pool.getConnection(function(err, connection) {
// 使用連接
connection.query('SELECT * FROM users', function(err, results, fields) {
// 釋放連接
connection.release();
// 錯誤處理
if (err) throw err;
console.log(results);
});
});
通過連接池連接選項:
-
connectionLimit
: 最大同時連接數(shù),默認(rèn)為10
終止連接池連接
pool.end(function (err) {
// all connections in the pool have ended
});
執(zhí)行sql
可以通過以下三種方式執(zhí)行sql語句
.query(sqlString, callback)
connection.query('SELECT * FROM `users` WHERE `name` = "Jack"', function(err, results, fields) {
// TODO
});
.query(sqlString, values, callback)
connection.query('SELECT * FROM `users` WHERE `name` = ?', ['Jack'], function(err, results, fields) {
// TODO
});
.query(options, callback)
connection.query({
sql: 'SELECT * FROM `users` WHERE `name` = ?',
timeout: 40000, // 40s
values: ['Jack']
}, function(err, results, fields) {
// TODO
});