Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。
一、前言
本文希望通过下面的知识讲解及一些实战经验分享,给予即将入门或正在学习的同学一些帮助。
在之前刚接触 Sequelize
的时候,遇到挺多问题,比如数据的聚合统计应该怎么做?复杂的排序规则应该怎么写?索引这块应该如何定义?性能如何衡量?等等这些问题,后来经过自己的琢磨及与后台人员交流探讨,这些问题都得予解决。
我们直接进入主题,学习目录结构如下:
一、前言
二、入门
1.配置
2.创建模型
3.增删改查
4.查询条件
三、进阶
1.联表查询
2.分组
3.聚合函数
4 索引
5.事务
四、实战演练
五、问题思考
二、入门
1.配置
module.exports = () => {
const config = (exports = {})
config.sequelize = {
//支持的数据库类型
dialect: 'mysql',
//连接数据库的主机
host: 'localhost',
//连接数据库的端口
port: 3306,
//数据库名称
database: 'db_test',
//数据库用户名
username: 'root',
//数据库密码
password: 'xxxxxx',
//设置标准时区
timezone: '+08:00',
//配置
dialectOptions: {
// 时间格式化,返回字符串
dateStrings: true,
typeCast(field, next) {
if (field.type === 'DATETIME') {
return field.string()
}
return next()
}
}
}
return config
}
注:如果没有加 dialectOptions
配置上的 typeCast
属性值为 true
的话,返回的时间是 ISO
标准时间日期字符。(如:'2022-04-16T15:02:08.017Z')
2.创建模型
2.1 常用数据类型
类型 | 说明 |
---|---|
INTEGER | 整数类型 |
STRING | 字符串 |
TEXT | 文本类型 |
BOOLEAN | 布尔类型 |
DATE | 时间类型 |
像数字、字符类型默认都有一些长度的限定,有时候因为长度问题导致接口出错,所以需要根据情况而定。
还有其他类型就不一一列了,需要用到的可以参照文档看看。Sequelize数据类型[1]
2.2 定义模型
module.exports = (app) => {
const { STRING, INTEGER, DATE } = app.Sequelize
const model = app.model.define(
'student',
{
id: {
//类型
type: INTEGER(11),
//是否允许为空
allowNull: false,
//是否为主键
primaryKey: true,
//自动自增
autoIncrement: true,
//备注
comment: '学生id',
},
name: {
type: STRING(50),
allowNull: false,
validate: {
notEmpty: true,
},
comment: '学生姓名',
},
class_id: {
type: INTEGER(11),
allowNull: false,
validate: {
notEmpty: true,
},
comment: '班级',
},
cid: {
type: STRING(50),
allowNull: false,
unique: 'cid',
validate: {
notEmpty: true,
},
comment: '身份证',
}
},
{
// 启动时间,设置为ture会自动生成创建和更新时间,默认字段名称为createAt、updateAt。
timestamps: true,
//对应的表名将与model名相同
freezeTableName: true,
//表备注
comment: '表1',
//创建时间字段别名或不展示
createdAt: 'createTime',
//更新时间字段别名或不展示
updatedAt: 'updateTime'
}
)
return model
}
使用 model.sync(options)
可自动执行 SQL
语句建表,但这个不建议用,第一这么做容易出现问题,第二我们的规范也不允许这么做。
2.3 表字段规范
这里讲的是我们公司的 SQL
规范,先来看一个案例:
CREATE TABLE `student` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '学生id',
`name` varchar(50) NOT NULL COMMENT '学生姓名',
`cid` varchar(50) NOT NULL COMMENT '身份证',
`class_id` int NOT NULL COMMENT '班级',
`create_time` datetime NOT NULL COMMENT '',
`update_time` datetime NOT NULL COMMENT '更新时间',
`mobile` varchar(50) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`id`),
UNIQUE KEY `cid_unique` (`cid`),
KEY `class_id` (`class_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '学生表';
审核结果:
![审核结果 a71a36cb5e57db963e7900c3c664b485.png](https://img-blog.csdnimg.cn/img_convert/a71a36cb5e57db963e7900c3c664b485.png)
下面讲一下基本的设计规范:
1) 禁用关键字
在设计的时候注意不要用到关键字,比如 name
、type
、status
等字段。
常见关键字:
![关键字 25d38d61d4bddf29e02aa8d255ef9af0.png](https://img-blog.csdnimg.cn/img_convert/25d38d61d4bddf29e02aa8d255ef9af0.png)
2) 字段禁止默认值为null
从上面的案例中 mobile
字段使用了允许为 null
值,审核平台这块没有强限制,但不建议用 null
为默