egg中使用Sequelize操作数据库-基础用法使用案例

2024-03-04 17:44

本文主要是介绍egg中使用Sequelize操作数据库-基础用法使用案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Sequelize-文档1-文档2

安装

$ npm install --save sequelize
# 还需要安装以下之一:
$ npm install --save pg pg-hstore  // postgreSql
$ npm install --save mysql // mysql 或 mariadb
$ npm install --save sqlite3  
$ npm install --save tedious // MSSQL
复制代码

建立连接

const Sequelize = require('sequelize')
const sequelize = new Sequelize(db.database, db.user, db.password, { //表名 用户名 密码host: db.host, //地址port: db.port, //端口dialect: 'mysql', //数据库类型:'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql'pool: { // 连接池配置max: 5,min: 0,acquire: 30000,idle: 10000,},timezone: '+08:00' //时区转换
})
复制代码

定义模型

const Sequelize = require('sequelize')
const moment=require('moment');
moment.locale('zh-cn');User: sequelize.define('user', {id: {type: Sequelize.STRING(255),primaryKey: true, //主键},name: Sequelize.STRING,role: Sequelize.INTEGER(11),open_id: Sequelize.STRING,describe: Sequelize.STRING,status: Sequelize.INTEGER(11),lv: Sequelize.INTEGER(11),token: Sequelize.STRING,create_time:{type: Sequelize.DATE,get() {return moment(this.getDataValue('create_time')).format('YYYY-MM-DD HH:mm:ss');}},update_time:{type: Sequelize.DATE,get() {return moment(this.getDataValue('update_time')).format('YYYY-MM-DD HH:mm:ss');}}
}, {freezeTableName: true,timestamps: false
})
复制代码

sql、orm对应关系

sqlorm
selectfindAll,findOne,findById,findOrCreate,findAndCountAll
updateupdate
insertcreate
deletedestroy

查询

查询单条数据

User.findOne({attributes: ['id', 'name', 'role', 'open_id', 'describe'],where: {id: id}
}).then(result => {console.log(result)
}).catch(err => {console.log(err)
});
复制代码

查询多条

findAll(opts) 或者 all(opts)

User.findAll()
复制代码

分页查询

findAndCount(opts) 或者 findAndCountAll

User.findAndCount({limit:10,//每页10条offset:0*10,//第x页*每页个数where:{}
});
复制代码

通过id查询

findById(id,opts)

User.findById(1);
复制代码

查询,不存在就新建一个

findOrCreate(opts)或者findCreateFind

User.findOrCreate({where: {open_id: req.body.open_id},defaults: {id: id,name: req.body.name,open_id: req.body.open_id,token: token,create_time: Date.now()}
}).then(result => {//返回值为数组,[json,created] 第一位是查询或创建的数据,第二位标识是否新建
})
复制代码

分组查询

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

聚合函数功能
COUNT()用于统计记录条数
SUM()用于计算字段的值的总和
AVG()用于计算字段的值的平均值
MAX用于查找查询字段的最大值
MIX用于查找查询字段的最小值
//求表中like字段值的和
orm.Article.findAll({attributes: [[Sequelize.fn('SUM', Sequelize.col('like')), 'likes']],
}).then(result=>{result[0].get('likes')
})
复制代码

更新

User.update({token: 'token'
}, {where: {id: l}
}).then(result => {console.log(result)
}).catch(err => {console.log(err)
});
复制代码

新增

User.create({id: id,name: req.body.name,open_id: req.body.open_id,create_time: Date.now()
}).then(result => {console.log(result)}).catch(err => {console.log(err)
});
复制代码

删除

User.destroy({where: {id: 1}
}).then(result => {console.log(result)
}).catch(err => {console.log(err)
});
复制代码

关联查询

一对一

sequelize 提供了两种一对一关系关联方法 belongsTo 和 hasOne

User.belongsTo(Article, { foreignKey: 'id', as: 'article',targetKey:'user_id'})
User.hasOne(Article, { foreignKey: 'user_id', as: 'article'})
复制代码

第一个参数为一个Model,第二个为options配置。 foreignKey:指定外键 as:指定别名 targetKey:目标键,是源模型上的外键列指向的目标模型上的列,默认情况下是目标模型的主键 两种方法都是把userInfo表关联到User表,区别是暴露外键的表不同:

  • belongsTo暴露出的是User表的‘id’字段作为外键去查询UserInfo表
  • hasOne方法暴露的是Article表的‘user_id’作为外键查询User表

使用

User.findeOne({where: {},include: {model: Article,as: 'article'where: {},required: false //仅对include的结果过滤}
})
复制代码

belongsTo 生成的sql

SELECT `user`.`id`, `user`.`name`, `article`.`id` AS `article.id`, `article`.`title` AS `article.title`, `article`.`user_id` AS `article.user_id` FROM `user` AS `user` LEFT OUTER JOIN `article` AS `article` ON `user`.`id` = `article`.`user_id` WHERE `user`.`id` = '1';
复制代码

hasOne 生成的sql

SELECT `user`.`id`, `user`.`name`,`article`.`id` AS `article.id`, `article`.`title` AS `article.title`, `article`.`user_id` AS `article.user_id` FROM `user` AS `user` LEFT OUTER JOIN `article` AS `article` ON `user`.`id` = `article`.`user_id` WHERE `user`.`id` = '1';
复制代码

belongsTo 使用User的外键作为条件去查询Article的主键 hasOne使用Article的外键作为条件去查询User的主键

一对多

hasMany

多对多

belongToMany

常用符号运算符

Operators解释
[Op.and]: {a: 5}AND (a = 5)
[Op.or]: [{a: 5}, {a: 6}](a = 5 OR a = 6)
[Op.gt]: 6,> 6
[Op.gte]: 6,>= 6
[Op.lt]: 10,< 10
[Op.lte]: 10,<= 10
[Op.ne]: 20,!= 20
[Op.eq]: 3,= 3
[Op.not]: true,IS NOT TRUE
[Op.between]: [6, 10],BETWEEN 6 AND 10
[Op.notBetween]: [11, 15],NOT BETWEEN 11 AND 15
[Op.in]: [1, 2],IN [1, 2]
[Op.notIn]: [1, 2],NOT IN [1, 2]
[Op.like]: '%hat',LIKE '%hat'
[Op.notLike]: '%hat'NOT LIKE '%hat'
[Op.iLike]: '%hat'ILIKE '%hat' (case insensitive) (PG only)
[Op.notILike]: '%hat'NOT ILIKE '%hat' (PG only)
[Op.startsWith]: 'hat'LIKE 'hat%'
[Op.endsWith]: 'hat'LIKE '%hat'
[Op.substring]: 'hat'LIKE '%hat%'
[Op.regexp]: '^[ha
[Op.notRegexp]: '^[ha
[Op.iRegexp]: '^[ha
[Op.notIRegexp]: '^[ha
[Op.like]: { [Op.any]: ['cat', 'hat']}LIKE ANY ARRAY['cat', 'hat'] - also works for iLike and notLike
[Op.overlap]: [1, 2]&& [1, 2] (PG array overlap operator)
[Op.contains]: [1, 2]@> [1, 2] (PG array contains operator)
[Op.contained]: [1, 2]<@ [1, 2] (PG array contained by operator)
[Op.any]: [2,3]ANY ARRAY[2, 3]::INTEGER (PG only)
[Op.col]: 'user.organization_id'= "user"."organization_id", with dialect specific column identifiers, PG in this example
const Op = Sequelize.Op;
//查询age < 18 或者小于5的数据
User.findAll({where: {age:{[Op.or]: {[Op.lt]: 18,[Op.eq]: 5}}}
}).then(result => {console.log(result)
}).catch(err => {console.log(err)
});

这篇关于egg中使用Sequelize操作数据库-基础用法使用案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773947

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S