Sequelize 中如何处理 PostgreSQL 中的 ENUM 字段类型
在 PostgreSQL 中,ENUM 是一种非常常见的数据类型,它允许您指定一组可以用于特定字段的常量值列表。然而,在使用 Sequelize 这样的 ORM 工具时,处理 ENUM 字段类型可能会存在一些困惑。本文将介绍如何在 Sequelize 中处理 PostgreSQL 中的 ENUM 字段类型,以帮助您更好地使用该 ORM 工具。
一、为什么要用 ENUM 字段类型
使用 ENUM 字段类型可以让我们更好地约束字段类型,防止出现不合法的数据,并且在约束了条件之后,也可以更好地展示相关数据。ENUM 字段类型在多种业务场景下都应用广泛,如订单状态、用户类型等等。
二、PostgreSQL 中 ENUM 字段类型的定义
PostgreSQL 中ENUM 的定义方式如下:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
其中 mood 的类型枚举了三种值:sad、ok、happy。这样当我们在创建表时使用 mood 类型时,mood 类型只能取 ENUM 中枚举出的值之一。
CREATE TABLE person ( name text, current_mood mood );
三、Sequelize 中的 ENUM 类型定义及使用
在 Sequelize 中定义 ENUM 类型很简单,只需要借助 DataTypes.ENUM 即可。
const User = sequelize.define('User', { mood: { type: DataTypes.ENUM, values: ['sad', 'ok', 'happy'] } });
在使用 ENUM 类型时,我们需要手动指定枚举的值列表。当我们再去插入数据时,只有 sad、ok、happy 才是合法数据,其他值会被 Sequelize 自动过滤,防止不合法数据插入表中。
await User.create({ mood: 'sad' }); // 合法 await User.create({ mood: 'angry' }); // 非法,Sequelize 会过滤该值,不会入库
四、示例代码
下面是一个完整的示例代码,其中通过定义 ENUM 字段类型并使用 Sequelize 实现了针对 candidates 表的用户身份认证管理。在 candidates 表中有一个身份认证状态字段 status,只能取 ENUM 中的两个值之一:passed 或 fail。
-- -------------------- ---- ------- ----- - ---------- --------- - - --------------------- ----- --------- - --- --------------------- ----------- ----------- - -------- ---------- --- ----- --------- - ----------------------------- - ------- - ----- --------------- ------- ---------- ------- - --- ------ -- -- - ----- ---------------- ------ ---- --- -- ---- --------- --------- - -------- ----- --- - ----- ---------- - ----- ------------------ ------- -------- --- --------------------------------- - ----- ------- - --------------------- - -- ---- --------- --------- - ------- ---------- --- - ----- ---------- - ----- ------------------ ------- ------- --- --------------------------------- - ----- ------- - --------------------- - -----展开代码
在上述示例代码中,我们定义了一个 candidates 表,并将 status 设为 ENUM 类型,后面通过 create 方法在表中成功插入了一个只包含 status 的记录,同时将 status 设为非法值,也能够被 Sequelize 拦截,不会插入到数据库中。
总结
在 Sequelize 中处理 PostgreSQL 的 ENUM 字段类型,只需要在定义模型时指定 ENUM 类型,并手动指定枚举的值列表。当我们再去插入数据时,只有 ENUM 类型定义里枚举的数据才是合法的,其他值会被 Sequelize 自动过滤,防止不合法数据插入表中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64661d5c968c7c53b06c7610