前言
在我们平时的项目中,数据库操作是一个必不可少的部分。而在 Node.js 中,Sequelize 是一个十分优秀的 ORM 框架,它提供了丰富的数据库操作 API。在这篇文章中,我们将介绍 Sequelize 中的数据转换和数据类型转换在查询中的应用,帮助读者更好地理解 Sequelize,提高工作效率。
数据转换
Sequelize 中的数据转换,我们可以简单地理解为在 Sequelize 中定义的 Model 和数据库中实际存储的数据之间的转换。例如,Model 中的某些字段可能是时间戳类型,但是在数据库中,该字段的存储类型可能是长整型。Sequelize 提供了一些数据转换器来处理这些情况。
实体属性转换器
实体属性转换器是更改模型实例中值的函数,不会更改模型原型(模型)、模型类或数据类型的定义。实体属性转换器用于将模型和数据库之间的数据格式相互转换,帮助我们将相应的值转化为最终结果。
在 Sequelize 中,比较常用的实体属性转换器包括:
- toString:将一个值转换为字符串类型
- toJSON:将一个值转换为 JSON 类型
- toNumber:将一个值转换为数字类型
- toBoolean:将一个值转换为布尔类型
// javascriptcn.com 代码示例 const User = sequelize.define("User", { username: { type: DataTypes.STRING, get() { const rawValue = this.getDataValue("username"); return rawValue.toUpperCase(); }, }, email: { type: DataTypes.STRING, set(value) { this.setDataValue("email", value.toLowerCase()); }, }, }); const user = User.build({ username: "John Doe", email: "JOHN.DOE@EXAMPLE.COM", }); console.log(user.username); // JOHN DOE console.log(user.toJSON()); // { username: 'JOHN DOE', email: 'john.doe@example.com'}
上面的示例中,我们定义了一个 User 模型,其中 username 和 email 字段分别通过实体属性转换器改变了最终值。username 的值是经过 toUpperCase 方法转换之后的大写字符串,而 email 的值是经过 toLowerCase 方法转换之后的小写字符串。
字段转换器
字段转换器是在 Sequelize 模型中声明的函数,它用于在模型上使用自定义 getter 和 setter 逻辑,以及在数据类型定义中使用自定义类型的逻辑。它可以将模型属性转换为模型中定义的类型或标准 JavaScript 数据类型,并在写入或读取到数据库时相应地格式化数据。
常见的 Sequelize 字段转换器包括:
- getter 和 setter 函数:getter 和 setter 函数是类似于实体属性转换器的函数,但是它们作用于特定的模型属性,以实现更具自定义化的转换逻辑。
- validate 函数:validate 函数可以在写入时验证值的类型及其它特性。
- defaultValue 属性:defaultValue 属性可以为特定的字段提供默认值。
- allowNull 属性:allowNull 属性指示什么时候可以为该字段的值为 null。
下面是一个使用 getter 和 setter 函数的示例:
// javascriptcn.com 代码示例 const User = sequelize.define("User", { name: { type: DataTypes.STRING, allowNull: false, get() { const rawValue = this.getDataValue("name"); return rawValue.toUpperCase(); }, set(value) { this.setDataValue("name", value.toUpperCase()); }, }, }); const user = User.build({ name: "John Doe" }); console.log(user.name); // JOHN DOE
上面的示例中,我们在 User 模型中定义了一个 name 字段,并在其上使用 getter 和 setter 函数。在获取 name 字段的值时,它通过 toUpperCase 方法转换成大写形式;在写入 name 字段时,它通过 toUpperCase 方法转换成大写形式。
对象转换器
Sequelize 中提供了许多助手函数,可以帮助我们将对象和数组转换为正确的格式。这些助手函数非常有用,可以简化包含嵌套数据的模型,例如,有时我们需要为模型添加关联,而关联模型又包含嵌套关系。
一些常见的 Sequelize 对象转换器包括:
- Op:Sequelize 提供了一组枚举类型,可以用这些枚举类型代替 SQL 运算符。
- col、fn 和 literal:这些助手函数创建了 SQL 函数,可以将它们传递给 SQL 查询。
- where:可以使用 where 条件,在查询时对查询结果集进行筛选。
下面是一个使用 Sequelize.Op 的示例:
const user = await User.findAll({ where: { age: { [Op.gt]: 18, }, gender: 'Male' }, });
上面的示例中,我们使用 Sequelize.Op.gt 运算符,查询 User 模型中年龄大于 18,且性别为男性的所有用户。
数据类型转换
当我们使用 Sequelize 读取数据时,有时需要将数据库中的特定数据类型转换为 JavaScript 数据类型。例如,我们的数据库中存储的数据类型可能是整型,而我们需要将它们转换为浮点型,以便 JavaScript 能够更好地操作这些数据。
数字类型转换
在 Sequelize 中,我们可以使用 Sequelize 提供的工具函数将数据库中的数字类型转换为 JavaScript 数字类型。以下是几个常用的工具函数:
- parseInt:将一个字符串将数字转换为整数。
- parseFloat:将一个字符串将数字转换为浮点数。
以下是一个示例:
const rawValue = 42; // 也可以是字符串类型 const numberValue = parseFloat(rawValue);
上面的示例中,我们使用 parseFloat 将输入值从字符串类型转换为浮点数类型。
时间类型转换
Sequelize 中的时间类型分为三类,分别是 DATE、DATETIME 和 TIMESTAMP。其中,DATE 只包含年月日信息,DATETIME 包括年月日和时间信息,而 TIMESTAMP 具有与 DATETIME 相同的功能,但是以 UNIX 时间戳的形式存储时间信息。
在读取时间类型数据时,我们可以使用 Sequelize 中的 moment 函数将日期转换为 JavaScript Date 对象:
const moment = require("moment"); const rawValue = "2022-01-21 14:30:00"; const dateValue = moment(rawValue).toDate();
上面的示例中,我们使用 moment 函数将日期时间字符串转换为 Date 对象,这样就可以在 JavaScript 中操作日期了。
总结
在 Sequelize 中,数据转换和数据类型转换都是一个很重要的部分。Sequelize 中提供了不同级别的转换函数,包含了实体属性转换器、字段转换器、对象转换器以及工具函数,这些函数都可以在不同的场景中应用到。在使用 Sequelize 的过程中,熟练掌握这些函数和工具将大大提高我们的工作效率和代码质量。
参考资料
- Sequelize Data Types
- Sequelize 数据文档
- Sequelize Querying - Raw Queries
- Sequelize Querying - Query Operators
- Sequelize Querying - Query Chaining
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6543a0d67d4982a6ebd6c87c