Sequelize模型基础完全指南
【免费下载链接】sequelize-docs-Zh-CN 项目地址: https://gitcode.com/gh_mirrors/se/sequelize-docs-Zh-CN
前言
Sequelize作为一款强大的Node.js ORM框架,其核心概念之一就是模型(Model)。模型是Sequelize与数据库交互的基础,理解模型的工作原理对于高效使用Sequelize至关重要。本文将全面介绍Sequelize模型的基础知识,帮助开发者掌握模型的定义、配置和使用方法。
什么是模型?
在Sequelize中,模型是数据库表的抽象表示。每个模型对应数据库中的一个表,模型实例则对应表中的一行记录。模型不仅定义了表的结构(字段名称、数据类型等),还提供了操作数据的方法。
模型的核心作用包括:
- 定义表结构
- 提供数据操作方法
- 处理数据验证
- 定义表间关系
模型定义方式
Sequelize提供了两种定义模型的等效方法,开发者可以根据项目需求和个人偏好选择使用。
1. 使用sequelize.define方法
这是最直接的定义方式,适合快速创建模型:
const { Sequelize, DataTypes } = require('@sequelize/core');
const sequelize = new Sequelize('sqlite::memory:');
const User = sequelize.define('User', {
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
}
});
2. 继承Model类
这种方式更适合TypeScript项目或需要更复杂模型逻辑的场景:
const { Sequelize, DataTypes, Model } = require('@sequelize/core');
const sequelize = new Sequelize('sqlite::memory:');
class User extends Model {}
User.init({
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
}
}, {
sequelize,
modelName: 'User'
});
两种方式本质上是等效的,sequelize.define内部也是调用Model.init方法。
模型与表名映射
默认情况下,Sequelize会自动将模型名复数化作为表名(如User模型对应Users表)。这种行为可以通过配置修改:
保持模型名与表名一致
sequelize.define('User', {
// 属性
}, {
freezeTableName: true
});
全局配置
const sequelize = new Sequelize('sqlite::memory:', {
define: {
freezeTableName: true
}
});
直接指定表名
sequelize.define('User', {
// 属性
}, {
tableName: 'Employees'
});
模型同步
模型定义后,需要与数据库中的实际表进行同步。Sequelize提供了几种同步策略:
1. 基础同步
await User.sync(); // 仅当表不存在时创建
await User.sync({ force: true }); // 强制重建表
await User.sync({ alter: true }); // 智能修改表结构
2. 同步所有模型
await sequelize.sync(); // 同步所有模型
await sequelize.sync({ force: true }); // 强制重建所有表
3. 删除表
await User.drop(); // 删除单个表
await sequelize.drop(); // 删除所有表
生产环境建议:在生产环境中,应使用迁移(Migrations)而非自动同步,以避免数据丢失风险。
模型属性配置
模型的核心是定义其属性(即表的列)。每个属性可以配置多种选项:
基础属性配置
sequelize.define('User', {
username: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: 'guest'
},
age: {
type: DataTypes.INTEGER,
validate: {
min: 0
}
}
});
常用属性选项
| 选项 | 描述 | 示例 |
|---|---|---|
| type | 数据类型 | DataTypes.STRING |
| allowNull | 是否允许NULL | false |
| defaultValue | 默认值 | 'default' |
| primaryKey | 是否主键 | true |
| autoIncrement | 自增 | true |
| unique | 唯一约束 | true或'uniqueName' |
| field | 数据库列名 | 'user_name' |
| references | 外键关联 | { model: Group, key: 'id' } |
数据类型详解
Sequelize支持丰富的数据类型,以下是常用类型概览:
字符串类型
DataTypes.STRING // VARCHAR(255)
DataTypes.STRING(100) // VARCHAR(100)
DataTypes.TEXT // TEXT
DataTypes.TEXT('tiny') // TINYTEXT
数值类型
DataTypes.INTEGER // INTEGER
DataTypes.BIGINT // BIGINT
DataTypes.FLOAT // FLOAT
DataTypes.DOUBLE // DOUBLE
DataTypes.DECIMAL(10,2)// DECIMAL(10,2)
日期时间
DataTypes.DATE // DATETIME
DataTypes.DATEONLY // DATE
DataTypes.TIME // TIME
其他类型
DataTypes.BOOLEAN // TINYINT(1)
DataTypes.JSON // JSON
DataTypes.UUID // UUID
DataTypes.ENUM('A','B')// ENUM
时间戳管理
默认情况下,Sequelize会自动管理createdAt和updatedAt字段:
// 禁用时间戳
sequelize.define('User', {
// 属性
}, {
timestamps: false
});
// 自定义时间戳字段名
sequelize.define('User', {
// 属性
}, {
timestamps: true,
createdAt: 'creationDate',
updatedAt: 'updateDate'
});
模型扩展
模型作为ES6类,可以方便地添加自定义方法:
实例方法
class User extends Model {
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
}
类方法
class User extends Model {
static findByEmail(email) {
return this.findOne({ where: { email } });
}
}
最佳实践
- 命名规范:模型名使用单数(User),表名使用复数(Users)
- 生产环境:禁用force/alter同步,使用迁移工具
- TypeScript:使用
declare关键字而非公共类字段 - 性能优化:合理使用索引和约束
- 代码组织:将模型定义分离到独立文件中
总结
Sequelize模型是与数据库交互的核心,通过本文我们了解了:
- 两种模型定义方式及其适用场景
- 模型与表名的映射关系
- 模型同步策略及生产环境注意事项
- 丰富的属性配置选项
- 全面的数据类型支持
- 模型扩展方法
掌握这些基础知识后,开发者可以更高效地使用Sequelize进行数据库操作。后续可以进一步学习模型关联、作用域、钩子等高级特性。
【免费下载链接】sequelize-docs-Zh-CN 项目地址: https://gitcode.com/gh_mirrors/se/sequelize-docs-Zh-CN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



