Migrations & seeders

502 阅读4分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

前言

平时我们直接使用mysql的指令去建库,然后编写代码增删改查数据库。但这种方式不利于团队开发。
在项目中,数据表的结构会不断地演进,在不同的环境中(开发环境、测试环境、生产环境中),我们都需要同一套数据结构,如果快速的变更各个环境的数据表?Migrations 解决了这个问题,它帮我们管理数据结构的变更。而seeders则是创建表后自动创建一些测试数据的初始化设置设置

sequelize

Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 PostgresMySQLMariaDBSQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。

Sequelize 遵从 语义版本控制。 支持 Node v10 及更高版本以便使用 ES6 功能。

利用sequelize插件 进行一系列设置 创建一个空项目,分别安装

  • sequelize ORM 框架
  • mysql2 mysql2模块
  • sequelize-cli 脚手架
npm install --save sequelize mysql2
npm install -g sequelize-cli

Migrations

原理

我们的每一次数据表更新,都需要新建一个Migrations文件
Migrations文件包含了以下信息

  • 操作时间,这个在文件名上
  • 数据库的相关操作,这些在 Migrations文件的updown函数中

有了这些信息,只要把所有Migrations文件中up函数数据库操作执行,即可以将数据表更新到最新状态

注意:所有的数据表修改操作,必须使用Migrations文件,不能直接使用sql直接更新,否则无法利用Migrations正确迭代和回退数据库版本

初始化

根目录下你需要执行 init 命令

sequelize init

这将创建以下文件夹

  • config, 包含配置文件,它告诉CLI如何连接数据库
  • models,包含您的项目的所有模型
  • migrations, 包含所有迁移文件
  • seeders, 包含所有种子文件

config

{
  "development": {
    "username": "root",
    "password": "123456",
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": "123456",
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": "123456",
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

注意:  如果你的数据库还不存在,你可以调用 db:create 命令。 通过正确的访问,它将为您创建该数据库。

创建migrations 文件

执行命令

sequelize migration:generate --name=users

执行后,会生成一个 Migrations文件 (<时间>-init-<操作名称>.js),代表新的一次迭代

up

执行 sequelize db:migrate 升级版本
升级版本的时候会调用up函数,需要在函数中对数据表进行更新迭代(创建、修改、删除)

**

up: (queryInterface, Sequelize) => {
    const { INTEGER, DATE, STRING } = Sequelize;
    await queryInterface.createTable('users', {
      id: { type: INTEGER, primaryKey: true, autoIncrement: true },
      name: STRING(30),
      age: INTEGER,
      created_at: DATE,
      updated_at: DATE,
    });
}

down

执行 sequelize db:migrate:undo 回退一个变更
回退版本的时候会调用down函数,需要在函数中对数据表进行更新的逆操作,例如在up创建表,down则是删除表

**

down: (queryInterface, Sequelize) => {
    await queryInterface.dropTable('users');
}

可以通过 db:migrate:undo:all 回退到初始状态

seeders

有的时候,我们需要为数据库写入一些测试数据,那么这个时候,我们就可以通过种子脚本来完成这个需求。


这个命令将会在 seeders 文件夹中创建一个种子文件。文件名看起来像是 XXXXXXXXXXXXXX-demo-user.js,它遵循相同的 up/down 语义,如迁移文件。

现在我们应该编辑这个文件,将演示用户插入users表。

up

up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert('users', [{
      id: 1,
      name: 'iwhao',
      age: 18,
      created_at: new Date(),
      updated_at: new Date(),
    }], {});
  },

执行 sequelize db:seed:all ,数据会写入数据库

down

down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete('users');
}

执行 sequelize db:seed:undo ,会撤销最新一个seed

如果你想撤销所有seed

sequelize db:seed:undo:all

以上就是本篇的全部内容了,非常感谢帅哥美女们能看到这里,如果这个文章写得还不错或者对你有一点点帮助,求点赞,求关注,求分享,当然有任何问题可以在评论讨论,我都会积极回答的,再次感谢😁