Sequelize模型基础完全指南

Sequelize模型基础完全指南

【免费下载链接】sequelize-docs-Zh-CN 【免费下载链接】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是否允许NULLfalse
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会自动管理createdAtupdatedAt字段:

// 禁用时间戳
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 } });
  }
}

最佳实践

  1. 命名规范:模型名使用单数(User),表名使用复数(Users)
  2. 生产环境:禁用force/alter同步,使用迁移工具
  3. TypeScript:使用declare关键字而非公共类字段
  4. 性能优化:合理使用索引和约束
  5. 代码组织:将模型定义分离到独立文件中

总结

Sequelize模型是与数据库交互的核心,通过本文我们了解了:

  • 两种模型定义方式及其适用场景
  • 模型与表名的映射关系
  • 模型同步策略及生产环境注意事项
  • 丰富的属性配置选项
  • 全面的数据类型支持
  • 模型扩展方法

掌握这些基础知识后,开发者可以更高效地使用Sequelize进行数据库操作。后续可以进一步学习模型关联、作用域、钩子等高级特性。

【免费下载链接】sequelize-docs-Zh-CN 【免费下载链接】sequelize-docs-Zh-CN 项目地址: https://gitcode.com/gh_mirrors/se/sequelize-docs-Zh-CN

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值