Sequelize 对 MySQL 的枚举类型的支持

· 约 5 分钟读完

在使用 Node.js 和 MySQL 建立 Web 应用时,使用 ORM(对象关系映射)方法可以简化代码的编写。Sequelize 是一个流行的 Node.js ORM 库,它支持多种数据库,包括 MySQL。在使用 Sequelize 进行开发时,有时需要使用 MySQL 的 ENUM(枚举)类型字段。本文将介绍 Sequelize 对 MySQL ENUM 类型的支持,为你在实际开发中提供实用的指导。

ENUM 类型简介

首先,我们先了解一下 MySQL 中 ENUM 类型的概念。ENUM 是一种 MySQL 数据类型,表示有限个数的取值集合。我们可以在创建表时使用 ENUM 类型定义一个字段,指定该字段可以取哪些值。

CREATE TABLE fruits ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(30), color ENUM('red', 'yellow', 'green') );

上述语句创建了一个名为 fruits 的表,其中 color 字段只能取值 'red', 'yellow', 'green' 中的一个。当我们在向该表中插入数据时,如果 color 字段的值不是这三个值中的一个,MySQL 就会报错。

ENUM 类型的优点是方便又节省空间。相比使用 VARCHAR 类型存储这些枚举值,ENUM 类型只需要使用一个字节就可以存储一个值,而 VARCHAR 类型则需要使用固定长度的字节。

Sequelize 中的 ENUM 类型

当我们使用 Sequelize ORM 操作 MySQL 数据库时,可以使用 Sequelize 提供的 ENUM 类型(sequelize.ENUM)来创建枚举类型字段。下面是一个例子:

const Fruit = sequelize.define('fruit', { name: Sequelize.STRING, color: Sequelize.ENUM('red', 'yellow', 'green') });

上述语句创建了一个 Fruit 模型(模型是 Sequelize 中的概念,对应 MySQL 中的表),其中 color 字段是一个 ENUM 类型字段,它只能取 'red', 'yellow', 'green' 中的一个值。

当我们创建了一个 Fruit 实例并调用其 save 方法时,如果输入的 color 字段值不是上述三个值中的一个,Sequelize 会抛出一个 ValidationError 的错误。我们也可以在代码中手动验证 color 字段的值是否合法。

const fruit = Fruit.build({name: 'apple', color: 'red'}); fruit.validate() .then(() => fruit.save()) .catch(Sequelize.ValidationError, () => { console.log('错误:颜色必须是 red, yellow 或 green'); });

上述代码创建了一个名为 apple,颜色为红色的水果实例,并调用其 validate 方法。如果颜色合法,就保存实例,否则捕获 Sequelize.ValidationError 错误并打印错误信息。

Sequelize 枚举类型的进阶应用

Sequelize 还提供了很多可以对 ENUM 类型进行操作的方法,使我们可以在实际开发中更方便地使用枚举类型。下面介绍其中几个实用的方法。

添加新的枚举值

在实际开发中,我们可能需要不断地在 ENUM 类型字段中添加新的枚举值。为了方便这个操作,Sequelize 提供了 addValues 方法。

比如,我们为 Fruit 模型添加了一个新的属性 smell:

Fruit.addColumn('smell', Sequelize.ENUM('good', 'bad'));

这时,我们可以使用 Fruit.addValues('smell', ['sweet', 'sour']) 方法为 ENUM 类型的 smell 属性添加新的值(注意:这里必须先通过 addColumn 方法添加 smell 属性)。

Fruit.addValues('smell', ['sweet', 'sour']) .then(() => console.log('添加成功')) .catch(() => console.log('添加失败'));

当添加成功时,调用 then 方法;如果失败,调用 catch 方法。

移除不需要的枚举值

在添加新的枚举值后,我们可能需要移除枚举类型中不再需要的旧值。为了方便这个操作,Sequelize 提供了 removeValues 方法。

比如,我们要删除 Fruit 模型中 color 属性的 'green' 值:

Fruit.removeValues('color', ['green']) .then(() => console.log('删除成功')) .catch(() => console.log('删除失败'));

与 addValues 方法一样,当删除成功时,调用 then 方法;如果失败,调用 catch 方法。

获取所有枚举值

有时我们需要获取某个 ENUM 类型字段的所有枚举值。为了方便这个操作,Sequelize 提供了 getValues 方法。

比如,我们要获取 Fruit 模型中所有的 color 值:

Fruit.getValues('color') .then(values => console.log(values)) .catch(() => console.log('获取失败'));

上述代码调用 Fruit.getValues('color') ,得到一个 Promise 对象。当获取成功时,values 参数就是所有可取的 color 值的数组;如果失败,调用 catch 方法。

结语

本文介绍了 Sequelize 对 MySQL 枚举类型的支持,以及一些进阶应用。这些应用可以让我们在实际开发中更加方便地使用枚举类型。希望这篇文章能为你提供实用的指导。

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