Sequelize 如何处理数据库表结构变更?

阅读时长 9 分钟读完

在使用 Sequelize 链接数据库并定义数据模型后,我们难免遇到修改表结构的情况,例如新增字段、更改字段类型等。 Sequelize 提供了方便的数据迁移工具支持这种表结构变更,本文将详细介绍 Sequelize 数据迁移的使用。

环境准备

在开始使用 Sequelize 数据迁移前,需要先安装 sequelize-cli 工具:

安装完成后,我们需要在项目根目录中执行如下命令来初始化 Sequelize 项目:

初始化完成后,我们会看到生成了 config、migrations、models、seeders 四个目录。

  • config:存放配置文件,包含数据库连接信息等;
  • migrations:存放数据迁移文件,可用于管理表结构的变更;
  • models:存放数据模型文件,每个模型对应一个表;
  • seeders:存放测试数据文件。

在 config/config.json 中配置好数据库连接信息后,我们可以定义一个 User 模型,并使用 sequelize-cli 生成 migration 文件:

这将在 models 目录中生成一个 User 模型文件,以及在 migrations 目录中生成一个新的 migration 文件。我们可以在 migration 文件中定义 User 表的初始结构:

-- -------------------- ---- -------
---- --------

-------------- - -
  --- ----- ---------------- ---------- -- -
    ----- ----------------------------------- -
      --- -
        ---------- ------
        -------------- -----
        ----------- -----
        ----- -----------------
      --
      ----- -
        ----- ----------------
      --
      ------ -
        ----- ----------------
      --
      ---------- -
        ---------- ------
        ----- --------------
      --
      ---------- -
        ---------- ------
        ----- --------------
      -
    ---
  --

  ----- ----- ---------------- ---------- -- -
    ----- ----------------------------------
  -
--

其中,up 函数表示对应的升级操作,down 函数表示对应的降级操作。在该文件中定义了 id、name、email、createdAt、updatedAt 五个字段。createdAt 和 updatedAt 是 Sequelize 自动生成的,用于记录数据创建和修改的时间。注意,该文件中并未包含主键和索引定义,因为 Sequelize 默认会为这些字段自动创建。

我们可以使用如下命令运行该 migration 文件:

运行该命令后,Sequelize 会在数据库中自动创建 User 表,并且包含 id、name、email、createdAt、updatedAt 五个字段。

数据迁移操作

下面我们介绍一些常用的数据迁移操作:

新增字段

我们可以使用如下命令生成一个名为 add_phone_to_user 的 migration 文件,用于为 User 表新增 phone 字段:

文件的内容如下:

-- -------------------- ---- -------
---- --------

-------------- - -
  --- ----- ---------------- ---------- -- -
    ----- --------------------------------- -------- -
      ----- ----------------
    ---
  --

  ----- ----- ---------------- ---------- -- -
    ----- ------------------------------------ ---------
  -
--

其中,up 函数中定义了添加 phone 字段的操作,down 函数中定义了删除 phone 字段的操作。我们可以使用如下命令运行该文件,完成迁移操作:

在这里需要注意,在 up 函数中定义的操作,只能执行一次,因此如果我们想要修改该字段的类型,需要使用下面介绍的修改字段类型操作。

修改字段类型

在运行了上一步的新增字段操作后,我们发现字段类型有误,需要将 phone 字段的类型从 STRING 修改为 INTEGER。我们可以使用如下命令生成一个名为 modify_phone_type 的 migration 文件,用于修改 User 表的 phone 字段类型:

文件的内容如下:

-- -------------------- ---- -------
---- --------

-------------- - -
  --- ----- ---------------- ---------- -- -
    ----- ------------------------------------ -------- -
      ----- -----------------
    ---
  --

  ----- ----- ---------------- ---------- -- -
    ----- ------------------------------------ -------- -
      ----- ----------------
    ---
  -
--

其中,up 函数中定义了将 phone 字段的类型修改为 INTEGER 的操作,down 函数中定义了将 phone 字段的类型修改回 STRING 的操作。

需要注意的是,在 MySQL 中,如果我们要将一个字段的类型从 VARCHAR 改为 INT 这样的类型,那么在 up 函数执行的过程中,Sequelize 会自动将该字段的数据类型修改为 INT,并将原有的字符串转换为相应的数字。但是,在 down 函数执行的过程中,Sequelize 会自动将该字段的数据类型改回 VARCHAR,而对象中存储的数字则会转换为字符串。因此,我们在 down 函数中需要对数据类型进行检查,以便正确地将字符串转换回数字,否则可能会引发错误。

我们可以使用如下命令运行该文件,完成迁移操作:

修改字段名

在运行了上一步的修改字段类型操作后,我们发现字段名也有误,需要将字段名 phone 修改为 mobile。我们可以使用如下命令生成一个名为 modify_phone_name 的 migration 文件,用于修改 User 表的字段名:

文件的内容如下:

-- -------------------- ---- -------
---- --------

-------------- - -
  --- ----- ---------------- ---------- -- -
    ----- ------------------------------------ -------- ----------
  --

  ----- ----- ---------------- ---------- -- -
    ----- ------------------------------------ --------- ---------
  -
--

其中,up 函数中定义了将 phone 字段名修改为 mobile 的操作,down 函数中定义了将 mobile 字段名修改回 phone 的操作。我们可以使用如下命令运行该文件,完成迁移操作:

删除字段

当我们需要删除 User 表中的某个字段时,可以使用如下命令生成一个名为 remove_phone_from_user 的 migration 文件:

文件的内容如下:

-- -------------------- ---- -------
---- --------

-------------- - -
  --- ----- ---------------- ---------- -- -
    ----- ------------------------------------ ----------
  --

  ----- ----- ---------------- ---------- -- -
    ----- --------------------------------- --------- -
      ----- ----------------
    ---
  -
--

其中,up 函数中定义了删除 mobile 字段的操作,down 函数中定义了添加 mobile 字段的操作。我们可以使用如下命令运行该文件,完成迁移操作:

结语

本文介绍了 Sequelize 的数据迁移操作,包括新增字段、修改字段类型、修改字段名、删除字段等常用操作。在实际项目中,尤其是在多人协作开发中,使用数据迁移工具能够更好地管理表结构的变更,避免手动修改出现错误。使用 Sequelize 的数据迁移工具,只需要编写相应的 migration 文件,并使用 sequelize-cli 工具运行相关命令,即可完成表结构变更的操作。希望本文能够为前端开发者提供一些借鉴和指导。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6782d2ac935627c9001e709b

纠错
反馈