前言
在 Node.js 的 Web 开发中,Sequelize 是一个非常常用的 ORM 框架。它可以让我们通过 JavaScript 对象的方式操作数据库,而不用直接编写 SQL 语句。在使用 Sequelize 的过程中,数据类型的定义是非常重要的,因为它直接影响到数据库表结构的设计和数据的存储。本文将介绍 Sequelize 中常用的数据类型及其映射关系。
数据类型
Sequelize 支持的数据类型包括:字符串、整数、浮点数、布尔值、日期、时间、JSON、数组、枚举和自定义类型。
字符串
字符串是最常用的数据类型之一,Sequelize 中有三种字符串类型:VARCHAR、CHAR 和 TEXT。VARCHAR 和 CHAR 的区别在于 VARCHAR 可以存储可变长度的字符串,而 CHAR 固定长度。TEXT 类型可以存储非常长的字符串,一般用于存储文章、评论等大段文字。
// javascriptcn.com 代码示例 const User = sequelize.define('user', { name: { type: Sequelize.STRING(50), // 最大长度为 50 allowNull: false // 不允许为空 }, bio: { type: Sequelize.TEXT // 可以存储非常长的字符串 } })
整数和浮点数
整数和浮点数分别对应 Sequelize 中的 INTEGER 和 FLOAT 类型。它们可以设置精度和范围。
// javascriptcn.com 代码示例 const Product = sequelize.define('product', { price: { type: Sequelize.FLOAT(6, 2), // 最大总长度为 6,小数点后最多 2 位 allowNull: false }, quantity: { type: Sequelize.INTEGER, // 整数类型 defaultValue: 0 // 默认值为 0 } })
布尔值
布尔值对应 Sequelize 中的 BOOLEAN 类型。它只能存储 true 或 false 两个值。
const Post = sequelize.define('post', { isPublished: { type: Sequelize.BOOLEAN, // 布尔值类型 defaultValue: false // 默认值为 false } })
日期和时间
日期和时间分别对应 Sequelize 中的 DATE 和 TIME 类型。它们可以存储年、月、日、时、分、秒等时间信息。
// javascriptcn.com 代码示例 const Event = sequelize.define('event', { startTime: { type: Sequelize.DATE, // 日期类型 allowNull: false }, endTime: { type: Sequelize.TIME // 时间类型 } })
JSON 和数组
JSON 和数组分别对应 Sequelize 中的 JSON 和 ARRAY 类型。它们可以存储复杂的数据结构。
const User = sequelize.define('user', { profile: { type: Sequelize.JSON // 可以存储 JSON 格式的数据 }, tags: { type: Sequelize.ARRAY(Sequelize.STRING) // 可以存储字符串数组 } })
枚举
枚举对应 Sequelize 中的 ENUM 类型。它可以限制字段的取值范围。
const Order = sequelize.define('order', { status: { type: Sequelize.ENUM('CREATED', 'PAID', 'SHIPPED', 'DELIVERED'), // 只能取值为枚举中的值 allowNull: false, defaultValue: 'CREATED' } })
自定义类型
Sequelize 还支持自定义数据类型,可以通过 sequelize.define
方法的第二个参数来定义。
// javascriptcn.com 代码示例 const MyType = sequelize.define('mytype', { name: { type: Sequelize.STRING, allowNull: false }, value: { type: Sequelize.INTEGER, allowNull: false } }, { // 自定义类型名称为 mytype // 可以在其他模型中使用 MyType 类型 // 例如:type: Sequelize.MyType type: 'mytype' })
映射关系
在数据库中,不同表之间可能存在关联关系,例如一对多、多对多等。Sequelize 支持多种映射关系。
一对一
一对一关系指的是两个表之间的记录是一对一的关系。例如,一个人只有一个身份证号码,一个身份证号码也只属于一个人。
// javascriptcn.com 代码示例 const Person = sequelize.define('person', { name: { type: Sequelize.STRING, allowNull: false } }) const IdCard = sequelize.define('idcard', { number: { type: Sequelize.STRING, allowNull: false, unique: true } }) // 建立一对一关系 Person.hasOne(IdCard) IdCard.belongsTo(Person)
在上面的代码中,Person.hasOne(IdCard)
表示一个人有一个身份证号码,IdCard.belongsTo(Person)
表示一个身份证号码属于一个人。
一对多
一对多关系指的是一个表中的一条记录可以对应另一个表中的多条记录。例如,一个班级有多个学生,一个学生只属于一个班级。
// javascriptcn.com 代码示例 const Class = sequelize.define('class', { name: { type: Sequelize.STRING, allowNull: false } }) const Student = sequelize.define('student', { name: { type: Sequelize.STRING, allowNull: false } }) // 建立一对多关系 Class.hasMany(Student) Student.belongsTo(Class)
在上面的代码中,Class.hasMany(Student)
表示一个班级有多个学生,Student.belongsTo(Class)
表示一个学生属于一个班级。
多对多
多对多关系指的是两个表之间的记录是多对多的关系。例如,一个学生可以选择多门课程,一门课程也可以被多个学生选择。
// javascriptcn.com 代码示例 const Course = sequelize.define('course', { name: { type: Sequelize.STRING, allowNull: false } }) const Student = sequelize.define('student', { name: { type: Sequelize.STRING, allowNull: false } }) // 建立多对多关系 Course.belongsToMany(Student, { through: 'course_student' }) Student.belongsToMany(Course, { through: 'course_student' })
在上面的代码中,Course.belongsToMany(Student, { through: 'course_student' })
表示一门课程可以被多个学生选择,Student.belongsToMany(Course, { through: 'course_student' })
表示一个学生可以选择多门课程。通过 through
参数指定关联表的名称。
总结
Sequelize 是一个非常强大的 ORM 框架,它支持多种数据类型和映射关系,可以帮助我们更方便地操作数据库。在使用 Sequelize 的过程中,合理地定义数据类型和映射关系非常重要,可以减少数据库表结构的冗余,提高数据库的性能。希望本文能对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65742705d2f5e1655dd68bd4