2. 在 Node.js 中操作 MySQL
相信只要是学习过编程的小伙伴一定听说过 MySQL。作为一个著名开源的关系型数据库,在实际的工作中的运用也非常地广泛。过去一直作为 Oracle 的对手般的存在,如今在被甲骨文收购之后,也依旧作为开源数据库的首选。在互联网时代兴起时,MySQL 就和 PHP、JAVA 一起支撑起各大网站,也出现了 WAMP、LAMP 这样的集成工具。
现在到了 Node.js 做后台的时代了。在这一章,我们主要介绍在 Node.js 中如何操作 MySQL。使用 Node.js 做后台框架的小伙伴一定不要错过哦~
2.1 MySQL 数据库简介
MySQL 就是在众多数据库产品中最受欢迎的一种。由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
在 Node.js 中要连接 MySQL 的话,就需要使用到第三方的库。这一章中将介绍 mysql
和 knex
两个库。两个都是非常优秀的类库,在使用上也十分方便。不过,两个的风格略有不同。要做个比较的话,大概像 Mybatis 和 Hibernate 这样吧。
在继续进行本章内容前,请先准备好 MySQL 和基本的 SQL 知识。有关于这部分的内容可以参照 这里 来进行学习(包含了从安装到基本概念的内容)。
2.2 mysql 库的使用
mysql
是一个完全由 JavaScript 所写成的 MySQL 连接工具。因此在 Node.js 上无需再做其他的配置,可以无缝使用。但是对于数据库的操作并没有做过多的封装,主要是通过原生的 SQL 语句进行,因此需要对 SQL 语句有一定的了解。在 mysql
中的方法都是回调的形式,在书写上需要我们注意(能拆分的尽量拆分,避免形成回调地狱)。
在 Node.js 上,我们只要执行 npm
命令就可以安装 mysql
了。
npm install mysql
安装完成之后那么就来进行实际的操作吧。
2.2.1 数据库的连接
第一步自然是要连接我们的数据库了。首先我们需要引入 mysql
库,通过调用 createConnection
方法进行数据库的连接,方法所接受的参数就是数据库的相关配置(我个人的习惯是写在另外的配置文件中管理,这样比较清晰也方便复用)。下面是官方给出的例子。
var mysql = require('mysql')
var connection = mysql.createConnection({
host : 'example',
user : 'admin',
password : '******',
database : 'my_db'
})
上面的例子中给出的数据库配置是最基本的配置。除了必须的数据库地址、用户名、要连接的数据库之外。mysql
还提供了其他可以供我们配置的参数。下面将列出的是比较常用的配置,完整的参数列表可以参考 官方文档。
编号 | 参数名 | 说明 |
---|---|---|
1 | port | 端口号,默认为 3306 |
2 | charset | 字符集,默认为 UTF8_GENERAL_CI 。如果有表情等拓展字符串的话,要使用 utf8mb4 |
3 | timezone | 时区,默认为 local 当地时区 |
4 | connectTimeout | 超时时间,默认为 1000 毫秒 |
5 | supportBigNumbers | 大数处理,默认为 false。当数据库中有 BIGNUMBER 或者 DECIMAL 类型的数据时,要开启此项 |
6 | bigNumberStrings | 与 supportBigNumbers 联动。如果仅配置 supportBigNumbers 在返回时会返回字符串而非 JavaScript 的 Number 对象(当范围在 [-2^53, +2^53] 之外时)。 |
7 | dateStrings | 让日期型数据以 JavaScript 的 Date 型返回 |
上面仅仅只是对 connection
进行了配置,并且得到一个 connection
对象。这个 connection
对象是 mysql
这个库的关键。因为后面的所有操作都是在这个对象上进行的。在使用之前,我们还需要打开 connection
。我们使用 connection.connect()
方法打开连接,该方法有一个回调,可以用来监听错误时的信息。
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
如果 connection.connect()
方法没有问题的话,就可以进行数据库的操作了。对于数据库的操作,我们通过 connection.query()
的方法进行。在 query
方法中,我们传入编写好的 SQL 语句来执行我们需要的操作,详细的说明我们会在下一小节展开。这里只需要知道执行 SQL 操作都是使用 connection.query()
方法即可。
connection.query('SELECT * from my_table', function (error, results, fields) {
if (error) throw error;
// connected!
});
自然,有建立连接就有关闭连接。mysql
为我们提供了两种方法来关闭数据库的连接。分别是 connection.end()
和 connection.destory()
。两者主要的区别在于end
要相对“温和”一些,会在所有的 SQL 执行完毕后关闭连接,并且提供一个回调函数用来处理错误。而 destory
则十分暴力,会立即关闭连接,并且不会提供回调函数供我们调用。通常清下,建议使用 connection.end()
方法。