当前位置:网站首页>【ORM框架:Sequelize的查询】
【ORM框架:Sequelize的查询】
2022-07-29 20:48:00 【꒰ঌsnail໒꒱】
一、ORM(Object Relational Mapping,对象关系映射)
1、持久化
持久化 :将内存中的对象保存到磁盘的数据库中或其他文件中
2、对象关系映射:
| 类 | 表 |
|---|---|
| 类的属性 | 表的列 |
| 类的对象 | 表的行 |
在js程序中对对象的操作,就是操作了数据库表的行.
3、ORM框架:Sequelize
(1)安装模块:
npm install mysql2
npm install sequelize
(2)创建数据库连接的配置对象
创建数据库连接的配置对象:使用sequelize完成相关配置
(3)使用sequelize建立模型(类)
使用sequelize建立模型(类),该模型实现与数据表的orm映射
(4)使用模型进行crud操作(增删改查)
| 方法 | 说明 |
|---|---|
| 模型名.findAll() | 查询所有 |
| 模型名.findOne() | 带条件查询 |
| 模型名.create() | 插入数据 |
| 模型名.destory() | 删除数据 |
| 模型名.update() | 更新数据 |
①查询所有
sequecrud.js后端代码:
//1、导入sequelize模块,引入框架
const Sequelize = require('sequelize')
//2、配置数据库连接对象
const mysqlDemo = new Sequelize('xy','root','123456',{
host:'localhost',
port:3306,
dialect:'mysql',//数据库方言,类型
pool:{
//数据库连接池
max:10,
min:3,
idle:100000
}
})
//3、导出数据库连接的配置对象
module.exports = mysqlDemo
Student.js映射数据库关系表的代码如下:
//1、导入sequelize模块
const Sequelize = require('sequelize')
//2、导入配置文件
const mysqlDemo =require('../seqconfig')
//3、创建数据类型(模型)
const Student = mysqlDemo.define('stu',{
Id:{
type:Sequelize.STRING,//数据类型
primaryKey:true,//主键
field:'sid'
},
Name:{
type:Sequelize.STRING,
field:'sname',
allowNull:false//该列不能为空(false),true表示可以为空
},
Age:{
type:Sequelize.INTEGER,
field:'age',
allowNull:false//该列不能为空(false),true表示可以为空
},
Gender:{
type:Sequelize.STRING,
field:'gender',
allowNull:false//该列不能为空(false),true表示可以为空
}
},
{
freezeTableName:true,//true表示应用用户自己的表名,false(默认)表示sequelize定义表名(就是模型名后面加s:Students)
timestamps:false//默认为true(会给表添加时间戳列,创建表的时间戳,更新表的时间戳两列),false表示不添加时间戳列。
})
module.exports = Student//导出这个数据库模型(表)
sequecrud.js路由接口文件代码如下:
const express = require('express')
const sequelize = require('sequelize')
const router = express.Router()
const Student =require('../config/model/Student')
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
module.exports=router
app.js配置代码:
var seqRouter=require('./routes/sequecrud')
app.use('/sequelize',seqRouter);
运行结果如下:
测试结果如下(查询全部数据):

②带条件查询
只修改sequecrud.js路由接口文件关键代码,其余代码同上:
//http://localhost:3000/sequelize/findone
router.get('/findone',(req, res) => {
Student.findOne({
where:{
Id:'S_1013'
}
}).then((data)=>{
res.send(data)
})
})
运行结果如下:
测试结果如下:
正如下图证明可得,查询结果正确。
③插入数据
只修改sequecrud.js路由接口文件关键代码,其余代码同上:
//http://localhost:3000/sequelize/add
router.get('/add',(req, res) => {
Student.create({
Id:'S_1012',
Name:'小王',
Age:'21',
Gender:'男'
}).then((data)=>{
res.send(data)
})
})
运行结果如下:
测试结果如下:
如下图查询数据库表知,插入数据成功:

④删除数据
只修改sequecrud.js路由接口文件关键代码,其余代码同上:
//http://localhost:3000/sequelize/delete
router.get('/delete',(req, res) => {
Student.destroy({
where:{
Id:'S_1012'
}
}).then((data)=>{
res.send(data)
})
})
运行结果如下:
数据已被删除如下图所示:
⑤更新数据
只修改sequecrud.js路由接口文件关键代码,其余代码同上:
//http://localhost:3000/sequelize/update
router.get('/update',(req, res) => {
Student.findOne({
where:{
Id:'s_1007'
}
}).then((Student)=>{
Student.update({
Name:'更新后',
Age:16,
Gender:'男'
}).then((data)=>{
res.send(data)
})
})
})
运行结果如下:

更新结果应如红框所示:
测试结果:
(5)只查询部分字段
例如:select sname from stu;的实现方式
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
attributes:['sname','sid'],//查询部分字段
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
运行结果:
(6)使用聚合函数:count()、sum()、avg()、max()、min()
attributes:[[sequelize.fn(‘count’,sequelize.col(‘sid’)),‘记录总数’]],
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
attributes:[[sequelize.fn('count',sequelize.col('sid')),'记录总数']],
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
运行结果:
(7)查询操作符的使用:需要导入Sequelize模块的Op子模块
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:
const Op =sequelize.Op
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
// attributes:['sname','sid'],//查询部分字段
// attributes:[[sequelize.fn('count',sequelize.col('sid')),'记录总数']],
where : {
sname: {
[Op.like]: '李%'
}
},
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
查询结果应如红框所示:
测试结果:
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:
const Op =sequelize.Op
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
// attributes:['sname','sid'],//查询部分字段
// attributes:[[sequelize.fn('count',sequelize.col('sid')),'记录总数']],
where : {
age:{
[Op.in]:[15,22]
}
},
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
查询结果应如红框所示:

测试结果:
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:
const Op =sequelize.Op
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
where : {
age:{
[Op.between]:[15,22]
}
},
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
查询结果应如红框所示:
测试结果:
(8)使用and 和 or谓词进行查询
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:
const Op =sequelize.Op
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
where : {
[Op.and]:[
{
sname:{
[Op.like]:'李%'
}
},
{
age:{
[Op.eq]:22
}
}
]
},
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
查询结果应如红框所示:

测试结果:

(9)对查询结果进行排序:使用order子句
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
order:[
['age','desc']
],
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
测试结果:
(10)使用limit进行查询
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
Student.findAll({
limit:2,
offset:3,
raw:true//目的是不显示时间戳
}).then(function(result){
res.send(result)
})
})
查询结果应如红框所示:
测试结果:

边栏推荐
- 根据昵称首字母生成头像
- 干货!联邦学习中的合作均衡
- SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南试读版
- Qualcomm WLAN framework learning (31) -- Power save
- Liu Genghong, boys and girls, come here!Sports data analysis and mining!(with a full set of code and data sets)
- VSCode配置终端为系统命令行
- 全景教程丨VR全景拍摄如何拍摄日出和日落的场景?
- 七个易犯的 IT 管理错误—以及如何避免
- 378. 有序矩阵中第 K 小的元素
- First thoughts on the first attempt to avoid killing without a file (Part 1)
猜你喜欢

A dish hold up valuations billions of mt. Pickled fish, can move beyond the edge food safety?

全自动化机器学习建模!效果吊打初级炼丹师!

2022了你还不会『低代码』?数据科学也能玩转Low-Code啦!

亚马逊登录参数metadata1,encryptedPwd逆向分析

Writing Elegant Kotlin Code: Talk About What I Think "Kotlinic"

一 JS中Promise用法、二闭包的概念与用法、三对象创建的四种方式与区区别、四 如何声明一个类

Second Best PyTorch Beginner Course; Thesis Writing Guide; Using µGo to Develop a Mini Compiler; Super Efficient Use of Transformer's Extension Library; Frontier Papers | ShowMeAI News Daily

刘畊宏男孩女孩看过来!运动数据分析挖掘!(附全套代码和数据集)
![[ACTF2020 新生赛]Exec 1](/img/1e/a3c19d514207e6965d09c66b86e519.png)
[ACTF2020 新生赛]Exec 1

Setinel 原理简介
随机推荐
网站ping端口的操作方法和命令介绍
最小jvm源码分析
刚重装的win7系统不能上网(深度系统安装步骤)
MySQL - Design game user information table
基于PaddleSpeech搭建个人语音听写服务
从实例学Kettle(一):获取股票行情数据
336. Palindromic Pairs
Durable rules (persistent rules engine) learning notes
容器网络硬核技术内幕 (小结-中)
Liu Genghong, boys and girls, come here!Sports data analysis and mining!(with a full set of code and data sets)
微信小程序 30 自定义模板和获取用户登录凭证
分布式限流 redission RRateLimiter 的使用及原理
OAuth,JWT ,OIDC你们搞得我好乱啊
【数据库】mysql日期格式转换
940. 不同的子序列 II
The demand for VR live broadcast marketing is increasing, and the data module is paving the way for us
解释器模式
错误解决:Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]
Use the PostgreSQL GRANT command to modify permissions on various database objects
336. 回文对