.. Author: huangxiaoyan Created time: 2019-11-13 17:23:38 Last Modified by: huangxiaoyan Last Modified time: 2020-03-16 16:50:39 .. meta:: :description lang=zh: Node.js 操作 MySQL 快速上手 :keywords: mysql, mysql 上手, 快速上手, node, nodejs, node.js ============== MySQL 快速上手 ============== 环境准备 ======== 本文假设你本地已经部署好 *MySQL* 服务,且采用默认端口 *3306*。 如果你还没准备好 *MySQL* 服务,可以参考 `MySQL`_ 官网文档下载并部署 *MySQL* 。 开发环境更推荐采用 *Docker* 容器化部署,以降低维护成本。 *Docker* 快速使用指引请看考这篇文章:`前端工程师眼中的 Docker`_ 。 mysql 模块 ========== *require* 引入 *mysql* 模块: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 1 :linenos: 连接数据库 ========== 首先,使用 *createConnection* 方法创建连接,并得到对象 *connection*: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 2-8 :linenos: *connect* 方法用于连接数据库,传入 *callback* 参数: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 9-31 :linenos: 回调函数中,我们做了这样一些操作:创建名为 *testDB* 的数据库,并将其指定为当前使用的数据库。 *query* 方法可接收 *SQL* 语句,接下来的一系列操作,我们还会继续用到它。 建表 ==== *query* 方法接收 *SQL* 语句和回调函数 *callback*,使用起来对于熟悉 *SQL* 语句的开发者甚为方便: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 33-40 :linenos: 至此,我们新建了一张 *user* 表,分别有 *name* 和 *age* 字段。 其中,*name* 字段为 *varchar* 类型,*age* 为 *int* 类型。 接下来,便可操作数据库,进行数据的插入、查询、更新、删除。 由于数据库的操作,均需建立在成功连接的基础上,因此,我们需要在 *connect* 方法的回调函数中执行这些操作。 代码框架如下: .. code-block:: javascript connection.connect((err) => { // 建表 // 插入 // 查询 // 更新 // 删除 // 断开连接 }) 插入 ==== 往 user 表中插入一条数据: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 42-48 :linenos: *query* 方法接收三个参数: 第一个参数是 *SQL* 语句;第二个参数是一个 *Object*,表示待插入的数据;最后一个参数是回调函数,返回执行后的结果。 注意到,*SQL* 语句中有 *?* 符号,指代的便是待插入的数据。 查询 ==== 查询 *user* 表中的所有数据: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 50-57 :linenos: 更新 ==== 将 *Alin* 的 *age* 字段值更改为 *22*: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 59-66 :linenos: 注意到,*query* 方法接收的第二个参数,是一个数组,按顺序分别对应 *SQL* 语句中的 *?* 符号。 删除 ==== 删除有关 *Alin* 的数据: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 68-74 :linenos: 断开连接 ======== *end* 方法表示断开数据库连接: .. literalinclude:: /_src/database/mysql/demo/demo.js :language: javascript :lines: 76-84 :linenos: 运行 Demo ========= 最后我们在终端执行以下命令,运行 demo: .. code-block:: shell-session $ node demo.js 输出以下结果: .. code-block:: shell-session connected! create database testDB successfully! use testDB successfully! create table successfully! insert data successfully! insertId is 0 select user all data: [ RowDataPacket { name: 'Alin', age: 21 } ] update Alin age successfully! OkPacket { fieldCount: 0, affectedRows: 1, insertId: 0, serverStatus: 34, warningCount: 0, message: '(Rows matched: 1 Changed: 1 Warnings: 0', protocol41: true, changedRows: 1 } delete Alin successfully! close mysql connection 下一步 ====== .. include:: /_fragments/next-step-to-wechat-mp.rst .. include:: /_fragments/disqus.rst .. _前端工程师眼中的 Docker: https://nodejs.fasionchan.com/zh_CN/latest/practices/docker/introduce.html .. _MySQL: https://www.mysql.com/cn/