当前位置:网站首页>【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)
})
})
查询结果应如红框所示:
测试结果:
边栏推荐
- 【593. Valid Square】
- Qualcomm WLAN framework learning (31) -- Power save
- 第二好PyTorch新手课程;论文写作指南;使用µGo语言开发迷你编译器;超高效使用Transformer的扩展库;前沿论文 | ShowMeAI资讯日报
- 什么是数据安全性?
- UDP协议详解
- 错误解决:Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]
- MySQL数据查询 - 简单查询
- Huawei laptop keyboard locked (how does the laptop keyboard light up)
- LeetCode 593 Valid Squares [Math] HERODING's Road to LeetCode
- 240. 搜索二维矩阵 II
猜你喜欢
【无标题】
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
First thoughts on the first attempt to avoid killing without a file (Part 1)
阿里 P8 爆出的这份大厂面试指南,看完工资暴涨 30k!
LeetCode 593 有效的正方形[数学] HERODING的LeetCode之路
回归——分层回归
一 JS中Promise用法、二闭包的概念与用法、三对象创建的四种方式与区区别、四 如何声明一个类
微信小程序 31 分包机制
2022了你还不会『低代码』?数据科学也能玩转Low-Code啦!
OneNote tutorial, how to take notes in OneNote?
随机推荐
【数据库】mysql日期格式转换
Bug fix: Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]
TCP协议详解
LeetCode--单链表--146.LRU缓存
Setinel 原理简介
《张卫国的夏天》欢乐来袭,黄磊、刘奕君携手演绎“冤种”兄弟
嵌入式分享合集24
336. 回文对
WeChat Mini Program 30 Customizing Templates and Obtaining User Login Credentials
系列(jupyter自动保存失败)
MySQL Data Query - Simple Query
LeetCode 593 Valid Squares [Math] HERODING's Road to LeetCode
MySQL数据查询 - 联合查询
7 行代码搞崩溃 B 站,原因令人唏嘘!
PointPillars 工程复现
SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南试读版
Looking for a job - a chat with my cousin
SwiftUI * @State 相关问题
Come in now!!!Take you to know the basic data types of C language
分析少年派2中的Crypto