sequelize学习使用

介绍

了解Sequelize,先了解以下概念:

什么是ORM

全称Object Relational Mapping - 对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不无需再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了

Sequelize是一个基于 Node.jsORM

Sequelize-cli 是其中一个独立的工具,提供了一些快速操作数据库的功能。比如:创建数据库、创建表等…。 (类似于 vuevue-cli 的关系)

使用

安装

​ 因为使用Mysql,所以安装的驱动是mysql2sequelize init是初始化

npm i -g sequelize-cli
npm i sequelize mysql2 
sequelize init

初始化sequelize项目,该命令将创建如下目录:

- config:包含配置文件,它告诉CLI如何连接数据库

- models:包含您的项目的所有模型

- migrations:包含所有迁移文件 (数据表结构

- seeders:包含所有种子文件 (具体数据

配置环境(config.json),着重修改开发环境

"development": {
    "username": "root",
    "password": "clwy1234",
    "database": "clwy_api_development",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+08:00",
    "port": 3307
  },

创建数据库和删除数据库

npm sequelize db:create

他会根据你config.json 中添加的数据名称创建

执行删除

npm sequelize db:drop list

创建模型文件 model

模型用于操作数据库表,执行下方命令生成模型:

sequelize model:generate --name Article --attributes title:string,content:text

model:generate / model:create

创建一个模型文件

– name:模型名称,必须

– attributes:字段列表,必须

  • 在 models 文件夹中创建了一个 Article模型文件(供程序使用)

  • - 在 migrations 文件夹中创建了一个名字像 xxxxxxxx-create-Article.js 的迁移文件(供迁移使用)

文件虽然建完了,但是数据库里却啥也没有。

需要执行以下命令才能写入数据库,就是我们核心要做的执行迁移

执行迁移

所谓迁移,就是对数据库进行创建、修改

sequelize db:migrate

之后就可在Navicat上看到创建的模型生成的Articles表了(另一个SequelizeMeta表是记录已经迁移的文件,下次迁移时就不会重复执行)

回退迁移操作

撤销迁移

db:migrate:undo - 撤销上一次的迁移操作

db:migrate:undo:all - 撤销所有的迁移操作

db:migrate:undo --name 具体迁移脚本

npm sequelize db:migrate:undo

种子文件

种子文件

迁移文件是用来构建数据库以及表结构的,种子文件是用来填充数据的

seed:generate --name demo-user (自定义的名字)   

种子文件脚本与迁移脚本类似,由up与down函数组成,传入的参数也是一致的

生成种子文件 name 后边接的是自定义的名字

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, {});
},
    async down (queryInterface, Sequelize) {
  await queryInterface.bulkDelete('Articles', null, {});
}

运行种子

sequelize db:seed --seed xxx-article #单个种子
npx sequelize db:seed:all #所有种子

(xxx-article这个是自己具体种子名)我的命令如下:

sequelize db:seed --seed 20240823095240-article

撤销种子执行

db:seed:undo --seed 指定种子文件 撤销指定种子文件

db:seed:undo:all 撤销所有种子文件

npm sequelize db:seed:undo:all

小结

以上是使用sequelize创建数据库,创建表的方法

步骤 命令 说明
第一步 sequelize model:generate --name Article --attributes … 建模型和迁移文件
第二步 人工处理 根据需求调整迁移文件
第三步 sequelize db:migrate 运行迁移,生成数据表
第四步 sequelize seed:generate --name article 新建种子文件
第五步 人工处理 将种子文件修改为自己想填充的数据
第六步 sequelize db:seed --seed xxx-article 运行种子文件,将数据填充到数据表中

之后将使用 Sequelize 提供的模型(Model)来操作数据库,并编写接口。

构建接口

以下是 Sequelize 中常用的方法,它们在构建接口时非常有用:

1. findByPk

  • 用途:通过主键(通常是 id)查找单个记录。
  • 示例Article.findByPk(req.params.id);

2. findAll

  • 用途:查询表中的所有记录或根据条件查询记录。
  • 示例Article.findAll({ where: { published: true } });

3. create

  • 用途:在数据库中创建一个新的记录。
  • 示例Article.create({ title: 'New Article', content: 'Content...' });

4. update

  • 用途:更新数据库中的记录。
  • 示例article.update({ title: 'Updated Title' }); (这里的 article 是一个已经查询到的模型实例)

5. destroy

  • 用途:删除数据库中的记录。
  • 示例article.destroy(); (这里的 article 是一个已经查询到的模型实例)

6. findOne

  • 用途:查询满足条件的第一个记录。
  • 示例Article.findOne({ where: { title: 'Some Title' } });

7. findAndCountAll

  • 用途:查询记录并返回总数和记录列表,适用于分页。
  • 示例
    const { count, rows } = await Article.findAndCountAll({
      where: { published: true },
      limit: 10,
      offset: 20
    });
    

8. bulkCreate

  • 用途:一次性创建多个记录。
  • 示例Article.bulkCreate([{ title: 'Title 1', content: 'Content 1' }, { title: 'Title 2', content: 'Content 2' }]);

9. bulkUpdate

  • 用途:一次性更新多个记录。
  • 示例
    await Article.update(
      { published: false },
      { where: { authorId: 1 } }
    );
    

10. bulkDelete

  • 用途:一次性删除多个记录。
  • 示例
    await Article.destroy({
      where: {
        published: false
      }
    });
    

11. count

  • 用途:计算满足条件的记录数。
  • 示例Article.count({ where: { published: true } });

12. max, min, sum, avg

  • 用途:执行聚合查询,如求最大值、最小值、总和、平均值等。
  • 示例Article.max('price', { where: { category: 'books' } });

13. belongsTo, hasOne, hasMany, belongsToMany

  • 用途:定义模型之间的关系。
  • 示例
    Article.belongsTo(Author);
    Author.hasMany(Article);
    

这些方法涵盖了从基本的 CRUD 操作到复杂的查询和关联操作。

在实际应用中,这些方法经常与 wherelimitoffsetorder 等选项结合使用,以执行更精确的数据操作。

记得在使用这些方法时,如果它们是异步的,通常需要配合 await 关键字在 async 函数中使用。

你可能感兴趣的:(学习)