使用 Sequelize ORM

前言

在日常开发中,其实很少写SQL语句,因为我们还有更简便的方式,也就是使用ORM来操作数据库。Sequelize中文文档

一、ORM 是什么

ORM是在数据库和编程语言之间建立一种映射关系,这样可以让我们有非常简单的代码,来实现各种数据库的操作。

例如:要查询文章表的所有内容,应该写:

// sql
SELECT * FROM `Articles`;

使用 ORM,就写成:

// 使用 ORM
Article.all()

Article,表示先找到Article这个模型。注意下,这里Article是单数形式,ORM 就是这么规定的。模型名是单数,对应的表名是复数。这样子,它就会自动找到 Articles 表上。all(),就是查询所有的数据了。整行的意思就是,查询 Articles 表的所有数据。

如果我想查询 id=2 的这条记录,也不用写:

// 查询 id=2 的记录
SELECT * FROM `Articles` WHERE `id`=2;

而会改为:

// 查询 id=2 的记录
Article.findByPk(2)

findByPk,里面的 Pk,就是 primary key,也就是主键的缩写。表里 id 就是主键,说白了就是通过id来查找数据。

使用ORM来操作数据库后,明显要比写 SQL 简单的太多了,再也不用背那么多可恶的 SQL 语句了。但这也不是说用了 ORM 以后,就一点也不用懂 SQL 语句了。ORM 它只是把我们写的代码,自动转换成 SQL 了再运行,在底层,实际上一样跑的还是 SQL 语句。

而且当我们开发中碰到问题了,要调试错误,依然要看命令行里面运行的 SQL 语句。所以就算开发中不写 SQL,也一定要能看懂是什么意思。

二、Sequelize ORM 的使用

先安装 sequelize 的命令行工具,需要全局安装,这样更方便使用。

// 安装
npm i -g sequelize-cli

接着确保命令行是在当前项目的命令行里,还要安装当前项目所依赖的 sequelize 包和对数据库支持依赖的 mysql2。

// 安装
npm i sequelize mysql2

最后,来初始化项目。

// 初始化
sequelize init

初始化后会创建一个 config 配置文件和三个目录,这些就是 sequelize 所需要的东西了。

config:是配置的意思,这里放的也就是 sequelize 所需要的连接数据库的配置文件。

migrations:是迁移的意思,如果你需要对数据库做新增表、修改字段、删除表等等操作,就需要在这里添加迁移文件了。而不是像以前那样,使用客户端软件来直接操作数据库。

models:这里面存放的是模型文件,当我们使用sequelize来执行增删改查时,就需要用这里的模型文件了。每个模型都对应数据库中的一张表。

seeders:是存放的种子文件。一般会将一些需要添加到数据表的测试数据存在这里。只需要运行一个命令,数据表中就会自动填充进一些用来测试内容的了。

三、模型、迁移与种子

1、数据库配置 config.js

config/config.json文件中有三组配置,分别是:development、test 和 production。它们分别是开发环境、测试环境、生产环境的数据库(用户名、密码 、数据库名称)配置,再加上加上中国时区的配置。配置好后,Node 项目就会自动的连接到数据库上了。

// config/config.json
{
  "development": { // 开发环境
    "username": "root",
    "password": "12341234", // 密码
    "database": "xxx_api_development", // 名称
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+08:00" // 时区
  },
  "test": { // 测试环境
    "username": "root",
    "password": null,
    "database": "xxx_api_test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+08:00"
  },
  "production": { // 生产环境
    "username": "root",
    "password": null,
    "database": "xxx_api_production",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+08:00"
  }
}

2、模型

使用sequelize来创建数据表,而不用手动建表。

// 新建模型
sequelize model:generate --name Article --attributes title:string,content:text

打开models/article.js。可以看到,在模型文件夹中,出现了一个叫做Article的模型,它里面有标题和内容。

使用sequelize来创建数据表,而不用手动建表。

3、迁移文件

migrations文件夹,出现了一个由当前时间,加上 create-article 命名的文件,这个文件就是迁移文件了。它的作用就是用来创建、修改表的。在 up 部分。通过 createTabel,创建了一个叫做 Articles 的表。

接着往下看,这些就是定义了 Articles 这张表里面所拥有的字段了,比方说 id、title、content,这些外还出现了两个时间字段 createdAt 和 updatedAt。这两个字段,当在新增或修改数据的时候,sequelize 会自动的帮我们填写的。

down 部分,是新建表的反向操作,里面写的是 dropTable,也就是删除当前的表。这样当我们创建表,建完后,突然又发现有错误,也可以通过相关命令来删除当前表。

运行迁移

// 迁移
sequelize db:migrate

打开数据库客户端,刷新一下,可以看到 Articles 表出现了。看一看结构选项卡,里面的字段和我们手动创建的完全一样,而且还多了两个时间字段。这就是迁移文件的作用了。

另外一张表 SequelizeMeta 是我们运行迁移命令时,自动生成的。这张表里记录了当前已经跑过了哪些迁移,这样当你再次运行 sequelize db:migrate 时,已经运行过的迁移文件,就不会重复再次执行了。

使用 sequelize来创建数据表,而不用手动建表。

4、种子文件

现在表也有了,下一步就是要填充一些在开发中用来测试的数据了。当然你可以用手动往里面一点点填,但很多情况我们做测试,可能需要非常多的数据。例如我希望数据库里有 100 篇文章,这时候,我们一条条的录入也太笨了点。最简单的方法就是使用种子文件了。

// 创建种子文件 
sequelize seed:generate --name article

完成后,在 seeds 目录,就看到刚才命令新建的种子文件了。同样也是分为两个部分,up 部分用来填充数据,down 部分是反向操作,用来删除数据的。

先来看 up 部分,默认生成的代码里,给了我们一个案例。很明显,它这里是往 People 表里,插入了一点儿数据。

// 
await queryInterface.bulkInsert('People', [{
  name: 'John Doe',
  isBetaMember: false
}], {});

我们可以参考它的写法,改为往 Articles 表里插入数据。

// 循环100条数据
async up (queryInterface, Sequelize) {
  const articles = [];
  const counts = 100;

  for (let i = 1; i <= counts; i++) {
    const article = {
      title: `文章的标题 ${i}`,
      content: `文章的内容 ${i}`,
      createdAt: new Date(),
      updatedAt: new Date(),
    };

    articles.push(article);
  }

  await queryInterface.bulkInsert('Articles', articles, {});
},

循环的数据,通过 push,不断的添加到 articles 里。最后一次性把所有的数据,插入到 Articles 表中。

至于down部分,也参考它的格式,修改一下。

//
async down (queryInterface, Sequelize) {
  await queryInterface.bulkDelete('Articles', null, {});
}

运行种子命令,将测试数据插入数据表中。

// 运行种子
sequelize db:seed --seed xxx-article

刷新数据库,一百条数据已经插入完成。

赞(0) 打赏

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫