🔥node中加入sequelize效率直线🚀提升30%,就问你快不快

前言

我们在写数据的时候,如果一直使用mysql写有哪些缺点使我们没法忍的?

  1. sql语句写起来复杂,语句很长,写起来不方便,sql赋值困难
  2. 如果我们在本地写了数据库,那么发布的时候还要迁移到线上,比较麻烦
  3. 团队协作能力提升,如果成员A改了数据表结构,那么其他成员还要单独修改这个表结构,难以忍受

1. sequelize是什么?

Sequelize 是一个基于 Node.js 的对象关系映射 (ORM) 库。它为开发者提供了一个简单易用的接口,用于与关系型数据库(如 MySQL、PostgreSQL 和 SQLite)进行交互。

这里我们画一下重点ORM(object relational mapping)即对象关系映射,他是在对象和数据库之间提供了一座桥梁,我们在操作数据库的时候就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和方法,就可以达到操作数据库的效果

这不就达到了我们的效果了么,我们根本就不想写那些复杂的SQL,我们只想简单快速的操作。

2. 为什么要使用sequelize呢?

也就是在前言中说的那些我们在实际开发中没法忍的mysql的痛

3. 如何使用sequelize

3.1. 创建sequelize实例

1、安装Sequelize

js 复制代码
npm i --save sequelize

2、以mysql数据库为例,需要安装mysql驱动 mysql2

补充:对于Node.js程序,访问MySQL也是通过网络发送SQL命令给MySQL服务器。这个访问MySQL服务器的软件包通常称为MySQL驱动程序。)

js 复制代码
npm i --save mysql2
  1. 创建实例:
js 复制代码
const c = {
   dbname: xxx // 数据库名字
   user: xxx // 数据库用户名
   password: xxx // 数据库密码
}
const Sequelize = require("sequelize")
const sequelize = new Sequelize(c.dbname, c.user, c.password, {
   dialect: 'mysql' // 数据库类型
   host: 'localhost' // 链接的主机域名
   port: '端口号'
})
  1. 链接测试
js 复制代码
sequelize.authenticate()
 .then(() => {
   console.log('链接成功')
}).catch(() => {
   console.log("链接失败")
})

3.2 自动同步模型

这里我们使用sequlize-automate

js 复制代码
npm install -g sequelize-automate

1. 设置sequelize-automate.coinfig.js

js 复制代码
module.exports = {
  dbOptions: {
    database: "xxx",
    username: "xxxx",
    password: "123456",
    dialect: "mysql",
    host: "localhost",
    port: 3306,
    logging: false
  },
  options: {
    type: "js",
    dir: "models"
 }
}

2. 设置package.json的script

js 复制代码
"scripts": {
    "automate": "sequelize-automate -c sequelize-automate.config.js"
  },

然后npm run automate

js 复制代码
const {
  DataTypes
} = require('sequelize');
module.exports = sequelize => {
  const attributes = {
    user_id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      defaultValue: null,
      primaryKey: true,
      autoIncrement: true,
      comment: null,
      field: "user_id"
    },
    user_name: {
      type: DataTypes.STRING(100),
      allowNull: false,
      defaultValue: null,
      primaryKey: false,
      autoIncrement: false,
      comment: null,
      field: "user_name"
    },
    email: {
      type: DataTypes.STRING(100),
      allowNull: false,
      defaultValue: null,
      primaryKey: false,
      autoIncrement: false,
      comment: null,
      field: "email"
    },
    password: {
      type: DataTypes.STRING(100),
      allowNull: false,
      defaultValue: null,
      primaryKey: false,
      autoIncrement: false,
      comment: null,
      field: "password"
    },
    create_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: null,
      primaryKey: false,
      autoIncrement: false,
      comment: null,
      field: "create_at"
    }
  };
  const options = {
    tableName: "user",
    comment: "",
    indexes: [],
    
  };
  const UserModel = sequelize.define("user_model", attributes, options);
  return UserModel;
};

3. db.ts配置

js 复制代码
const Sequelize = require('sequelize');
const UserModel = require('../models/user');

// Option 1: Passing parameters separately
const sequelize = new Sequelize('admin', 'root', '123456', {
  host: 'localhost',
  dialect: 'mysql',
  define: {
    timestamps: false,
    paranoid: true,
    underscored: true,
  }
});

const User = UserModel(sequelize);
const db = {
  User
}

export default db;

3.3 Sequelize 常用增删改查函数

增删改查对应的函数

sql 函数
select findAll, findOne, findByPk(Pk:primary key), findAndCountAll
update update
insert create
update delete

1,查询

1.1 查询单条数据
js 复制代码
const user = await ctx.model.User.findOne({
  attributes: ['id', 'name'], // 结果过滤,只显示 id,name 字段
  // attributes: { exclude: ['role'] } // 不显示 role 字段
  where: {
    id: id
  },
  order: [ // 排序
    ['showCount', 'DESC']
  ]
});

// 字段重命名:查询属性(字段)可以通过传入一个嵌套数据进行重命名
attributes: ['id', ['name', 'myName']]
将字段name重命名为myName,这样返回的结果里面的字段就是myName
1.2 查询多条数据
js 复制代码
const user = await ctx.model.User.findAll({
  limit: 10, //每页10条
  offset: 0*10, //第x页*每页个数
  where: {} // 条件
});
1.3 分页查询
js 复制代码
// 返回列表的总数
const { app, ctx } = this;
const { gt } = app.Sequelize.Op;
const user = await ctx.model.User.findAndCountAll({
  limit: 10, //每页10条
  offset: 0*10, //第x页*每页个数
  where: { // 条件
    id: {
      [gt]: 6 // id > 6
    }
  } 
});
1.4 通过id查询
js 复制代码
const user = await ctx.model.User.findByPk(1);
1.5 查询单个数据
js 复制代码
const user = await ctx.model.User.findOne({
  where: {} // 条件
});
1.6 分组查询

分组查询通常要与聚合函数一起使用,聚合函数包括:

聚合函数 功能
COUNT 用于统计记录条数
SUM 用于计算字段的值的总和
AVG 用于计算字段的值的平均值
MAX 用于查找查询字段的最大值
MIX 用于查找查询字段的最小值
js 复制代码
// 求表中num字段值的和
const { app, ctx } = this;
const { fn, col } = app.Sequelize;
// fn 指的是函数
// col 指的是字段
const user = await ctx.model.User.findOne({
  attributes: [[fn('SUM', col('num')), 'all_num']]
  where: {} // 条件
});

sql语句:select sum('num') as 'all_count' ...

2,新增

js 复制代码
// 如果id为自增的主键,那么新增数据时候不需要添加id
const user = await ctx.model.User.create({ name, age });

3,修改

js 复制代码
// 修改之前先判断这条数据是否存在
const user = await ctx.model.User.findByPk(id);

// 如果数据存在,再修改
await user.update({ name, age }, {
  where: {}
});

4,删除

csharp 复制代码
// 删除之前先判断这条数据是否存在
const user = await ctx.model.User.findByPk(id);

// 如果数据存在,再修改
await user.destroy();

3.4 如何同步数据库

要同步数据库,请使用 sequelize.sync() 方法。它会根据您的模型创建数据库表。如果您希望强制重新创建数据库表,可以使用 { force: true } 选项。

例如:

js 复制代码
sequelize.sync({ force: true }).then(() => { console.log("数据库同步成功"); });

同步数据库可能会遇到一下问题

arduino 复制代码
Invalid default value for 'user_name'

当在使用Sequelize同步模型时遇到 "Invalid default value" 错误,并且错误信息指向 'user_name' 字段时,通常是由于您在模型中对该字段的默认值设置不符合数据库的要求。

这个时候可以把字段的defaultValue设置为undefined,或者直接删除掉defaultValue这个属性

参考

相关推荐
jgbazsh1 分钟前
Spring中把一个bean对象交给Spring容器管理的三种方式
java·后端·spring
zybsjn9 分钟前
一天快速实现markdown 编辑器和排版工具:基于Node.js + Express + 原生JS的开发实践
node.js·express·ai编程
书中枫叶12 分钟前
个人主页网站SEO | 个人博客基于Nuxt
typescript·node.js·nuxt.js
华仔啊12 分钟前
前端不懂 Java?后端怕 CSS?这套AI全栈方案专治各种偏科
java·前端·后端
木易 士心12 分钟前
Node.js 后端开发全解析:从核心原理架构到实战应用
后端·架构·node.js
皮卡丘不断更13 分钟前
我把传统项目问答升级成了 Agent-RAG:Spring Boot + FastAPI + ChromaDB 工程落地实践
人工智能·spring boot·后端·架构·python3.11
H5css�海秀9 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
SuniaWang9 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长9 小时前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji34169 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端