学会Sequelize,让你操作数据更丝滑

d77b1c9a9e9ee1d4c440932cc2779e63.png

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
审核结果

下面讲一下基本的设计规范:

1) 禁用关键字

在设计的时候注意不要用到关键字,比如 nametypestatus 等字段。

常见关键字:

25d38d61d4bddf29e02aa8d255ef9af0.png
关键字

2) 字段禁止默认值为null

从上面的案例中 mobile 字段使用了允许为 null 值,审核平台这块没有强限制,但不建议用 null 为默

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值