安装
$ cnpm i mysql
介绍
mysql
模块是Node.js的mysql驱动,由JavaScript编写,不需要编绎,并且完全开源。
示例
首先创建测试用的数据库与数据表:
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();
输出结果如下:
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
: 端口(可选,默认为3306) -
user
: 用户名 -
password
: 密码 -
database
: 数据库(可选)
终止连接
有两种方式实现终止MySQL连接。通过end()
方法优雅终止:
connection.end(function(err) {
// The connection is terminated now
});
通过destroy()
方法立即终止(没有回调):
connection.destroy();
连接池连接
除了创建和管理逐个的连接,此模块还提供了一个内建的连接池,通过mysql.createPool(config)
方式使用。
为什么为使用数据库连接池?百度百科上是这么写的:
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
使用连接池:
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
: 最大同时连接数,默认为10
终止连接池连接
pool.end(function (err) {
// all connections in the pool have ended
});
执行sql
可以通过以下三种方式执行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
});