第七章 数据库迁移 Migrate

首先安装以下工具 (工具不提供 ts 支持)

npm install -g sequelize-cli
mkdir models && cd models
npm init -y
npm i sequelize mysql2 -S

在安装了 sequelize 的 node 项目中运行以下,便可看到如下信息。

$ sequelize

Sequelize [Node: 8.1.2, CLI: 2.7.0, ORM: 4.2.0]

Usage
  sequelize [task] [OPTIONS...]
Available tasks
  db:migrate             Run pending migrations.
  db:migrate:old_schema  Update legacy migration table
  db:migrate:status      List the status of all migrations
  db:migrate:undo        Reverts a migration.
  db:migrate:undo:all    Revert all migrations ran.
  db:seed                Run specified seeder.
  db:seed:all            Run every seeder.
  db:seed:undo           Deletes data from the database.
  db:seed:undo:all       Deletes data from the database.
  help                   Display this help text. Aliases: h
  init                   Initializes the project. [init:config, init:migrations, init:seeders, init:models]
  init:config            Initializes the configuration.
  init:migrations        Initializes the migrations.
  init:models            Initializes the models.
  init:seeders           Initializes the seeders.
  migration:create       Generates a new migration file. Aliases: migration:generate
  model:create           Generates a model and its migration. Aliases: model:generate
  seed:create            Generates a new seed file. Aliases: seed:generate
  version                Prints the version number. Aliases: v
Available manuals
  help:db:migrate             The documentation for "sequelize db:migrate".
  help:db:migrate:old_schema  The documentation for "sequelize db:migrate:old_schema".
  help:db:migrate:status      The documentation for "sequelize db:migrate:status".
  help:db:migrate:undo        The documentation for "sequelize db:migrate:undo".
  help:db:migrate:undo:all    The documentation for "sequelize db:migrate:undo:all".
  help:db:seed                The documentation for "sequelize db:seed".
  help:db:seed:all            The documentation for "sequelize db:seed:all".
  help:db:seed:undo           The documentation for "sequelize db:seed:undo".
  help:db:seed:undo:all       The documentation for "sequelize db:seed:undo:all".
  help:init                   The documentation for "sequelize init".
  help:init:config            The documentation for "sequelize init:config".
  help:init:migrations        The documentation for "sequelize init:migrations".
  help:init:models            The documentation for "sequelize init:models".
  help:init:seeders           The documentation for "sequelize init:seeders".
  help:migration:create       The documentation for "sequelize migration:create".
  help:model:create           The documentation for "sequelize model:create".
  help:seed:create            The documentation for "sequelize seed:create".
  help:version                The documentation for "sequelize version".

对于命令可以通过 help:xxxx 来查看帮助。

初始化

运行 sequelize init 进行初始化,该命令是以下命令的总和。

此时我们会得到几个文件夹 config / migrations / models/ seeders

config 是 sequelize 的配置目录,比如数据库地址等等,有好几个环境的配置项。 migrations 是通过 js 文件里面定义好的创建数据表。修改数据库表的文件。 models 就是我们自己定义模型的地方 seeders 就是填充假数据的地方

查看如何创建一个模型

运行一下 sequelize help:model:create 命令,可以看到如下信息。

紧接着我们再运行一下

再来看看 models 文件夹和 migrations 文件夹就会发现出现了一些文件。

migrations/xxxxx-create-user.js 文件里面会看到,queryInterface.createTable很明显就是创建一个数据表而 queryInterface.dropTable就是删除一个数据表。

queryInterface 气死在 d.ts 文件里面可以找到,在 4206 - 4329 行,大家可以自己查找他能使用的方法。

定义一下关系

models/user.js

解决无法关联的问题

接下来我们来测试一下方法

在项目根目录下面新建 index.js

运行一下,会发现 User 并没有与 Book 建立联系,这是什么情况呢?但是确实又是在对象里面看到了有classMethods 这个东西。

然后我们再来到 models/index.js 修改一下 27 行、

打印如下(index.js 是项目跟目录下面的)

这很明显,classMethods 上面的方法,没有代理到对象上面去。而且在之前也提到过 v4 版本好像不再支持 这种做法,所以,我们可以自己修改一下。

之后再次运行

很明显这一次就成功的进行了关联。

再次修改并,保存一下联系

seeder 填充

新建一个填充文件

安装假数据生成工具

假数据生成工具支持的配置请点这里

修改文件代码如下。

对于上面代码,觉得很难的自己用最简单的 queryInterface.bulkInsert 去插入数据就行了。 嵌套的这种形式,我找了一下 API 发现只有 create 支持。

运行命令 sequelize db:migrate:status 查看当前 数据库表创建的情况

这里表示我们没有创建表。创建了之后会是 up 状态。

运行 sequelize db:migrate

此时数据库里面以及有了表了。而且多了一个表SequelizeMeta 这个是用来继续迁移的表。

sequelize db:migrate:undo:all 可以撤销刚刚所迁移的数据表,前提是你的 migarations 文件里面有写这个 down 方法。这种操作被称为回滚。undo:all 是撤销全部,而undo就是撤销一步。

接下来继续运行命令

便可在数据库里面看到数据,不过此操作也是可以回滚的,通过seed:undo:all即可。当然前提是你在代码里面以及定义了如何回滚。也就是down方法。

Last updated