廖雪峰老师的课堂——使用Sequelize

访问MySQL

当我们安装好MySQL后,Node.js程序如何访问MySQL数据库呢?

访问MySQL数据库只有一种方法,就是通过网络发送SQL命令,然后,MySQL服务器执行后返回结果。

我们可以在命令行窗口输入,然后输入root口令后,就连接到了MySQL服务器。

因为没有指定参数,所以我们连接到的是,也就是本机的MySQL服务器。

在命令行窗口下,我们可以输入命令,操作MySQL服务器:

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| test |

+--------------------+

4rowsinset (.05sec)

输入退出MySQL命令行模式。

对于Node.js程序,访问MySQL也是通过网络发送SQL命令给MySQL服务器。

这个访问MySQL服务器的软件包通常称为MySQL驱动程序。

不同的编程语言需要实现自己的驱动,MySQL官方提供了Java、.Net、Python、Node.js、C++和C的驱动程序,官方的Node.js驱动目前仅支持5.7以上版本,而我们上面使用的命令行程序实际上用的就是C驱动。

目前使用最广泛的MySQL Node.js驱动程序是开源的,可以直接使用npm安装。

ORM

如果直接使用包提供的接口,我们编写的代码就比较底层,例如,查询代码:

考虑到数据库表是一个二维表,包含多行多列,例如一个的表:

mysql> select * from pets;

+----+--------+------------+

| id |name| birth |

+----+--------+------------+

| 1 |Gaffey| 2007-07-07 |

| 2 |Odie| 2008-08-08 |

+----+--------+------------+

2rowsinset (.00sec)

每一行可以用一个JavaScript对象表示,例如第一行:

这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。是不是很简单?

但是由谁来做这个转换呢?所以ORM框架应运而生。

我们选择Node的ORM框架Sequelize来操作数据库。这样,我们读写的都是JavaScript对象,Sequelize帮我们把对象变成数据库中的行。

用Sequelize查询表,代码像这样:

因为Sequelize返回的对象是Promise,所以我们可以用和分别异步响应成功和失败。

但是用和仍然比较麻烦。有没有更简单的方法呢?

可以用ES7的await来调用任何一个Promise对象,这样我们写出来的代码就变成了:

真的就是这么简单!

await只有一个限制,就是必须在async函数中调用。上面的代码直接运行还差一点,我们可以改成:

考虑到koa的处理函数都是async函数,所以我们实际上将来在koa的async函数中直接写await访问数据库就可以了!

这也是为什么我们选择Sequelize的原因:只要API返回Promise,就可以用await调用,写代码就非常简单!

实战

在使用Sequlize操作数据库之前,我们先在MySQL中创建一个表来测试。

我们可以在数据库中创建一个表。数据库是MySQL安装后自动创建的用于测试的数据库。在MySQL命令行执行下列命令:

第一条命令是创建MySQL的用户名和口令,均为,并赋予操作数据库的所有权限。

第二条命令把当前数据库切换为。

第三条命令创建了表。

然后,我们根据前面的工程结构创建工程,结构如下:

然后,添加如下依赖包:

注意是驱动,我们不直接使用,但是会用。

用安装。

实际上是一个简单的配置文件:

下面,我们就可以在中操作数据库了。使用Sequelize操作MySQL需要先做两件准备工作:

第一步,创建一个sequelize对象实例:

第二步,定义模型Pet,告诉Sequelize如何映射数据库表:

用定义Model时,传入名称,默认的表名就是。

第二个参数指定列名和数据类型,如果是主键,需要更详细地指定。

第三个参数是额外的配置,我们传入是为了关闭Sequelize的自动添加timestamp的功能。

所有的ORM框架都有一种很不好的风气,总是自作聪明地加上所谓“自动化”的功能,但是会让人感到完全摸不着头脑。

接下来,我们就可以往数据库中塞一些数据了。我们可以用Promise的方式写:

也可以用await写:

显然await代码更胜一筹。

查询数据时,用await写法如下:

如果要更新数据,可以对查询到的实例调用方法:

如果要删除数据,可以对查询到的实例调用方法:

运行代码,可以看到Sequelize打印出的每一个SQL语句,便于我们查看:

Model

我们把通过返回的称为Model,它表示一个数据模型。

我们把通过返回的一个或一组对象称为Model实例,每个实例都可以直接通过序列化为JSON字符串。

但是它们和普通JSON对象相比,多了一些由Sequelize添加的方法,比如和。调用这些方法我们可以执行更新或者删除操作。

所以,使用Sequelize操作数据库的一般步骤就是:

首先,通过某个Model对象的方法获取实例;

如果要更新实例,先对实例属性赋新值,再调用方法;

如果要删除实例,直接调用方法。

注意方法可以接收、这些参数,这和将要生成的SQL语句是对应的。

文档

Sequelize的API可以参考官方文档。

参考源码

hello-sequelize

https://github.com/michaelliao/learn-javascript/tree/master/samples/node/web/db/hello-sequelize

有你想看的精彩

感谢您的阅读,如果你觉得我的公众号还不错,请多帮我推荐给你的朋友,多谢了。

前端大牛爱好者:每天一篇前端技术文章,不定时前端干货发送

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180903B19IYE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券