当前位置:网站首页>【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)
})
})
查询结果应如红框所示:
测试结果:

边栏推荐
- 赶紧进来!!!带你认识C语言基本数据类型
- ALBERT: A Lite BERT for Self-supervised Learning of Language Representations
- 分析少年派2中的Crypto
- json-c实现json和结构体之间的相互转换
- 【无标题】
- 全景教程丨VR全景拍摄如何拍摄日出和日落的场景?
- R language for airbnb data nlp text mining, geography, word cloud visualization, regression GAM model, cross-validation analysis
- 酷客导航助你商场轻松购物,业务办理不迷茫
- WPF 实现抽屉菜单
- mos管闩锁效应理解学习
猜你喜欢

赶紧进来!!!带你认识C语言基本数据类型

378. The Kth Smallest Element in an Ordered Matrix

三品牌下半年将带来多款新品,东风日产将迎来“产品大潮”

240. Searching 2D Matrix II

OAuth,JWT ,OIDC你们搞得我好乱啊

Fully automated machine learning modeling!The effect hangs the primary alchemist!

940. Different subsequences II

MySQL Data Query - Union Query

人社部公布“数据库运行管理员”成新职业,OceanBase参与制定职业标准

336. Palindromic Pairs
随机推荐
惠普服务器硬盘指示灯不亮或显示蓝色
赶紧进来!!!带你认识C语言基本数据类型
WPF 实现抽屉菜单
带你刷(牛客网)C语言百题(第四天)
JSP Servlet JDBC MySQL CRUD Sample Tutorial
[Database] mysql date format conversion
Liu Genghong, boys and girls, come here!Sports data analysis and mining!(with a full set of code and data sets)
sizeof和strlen的区别(strlen和sizeof的用法)
Cooler Navigation helps you shop easily in shopping malls without confusion
JS实现百叶窗特效
240. 搜索二维矩阵 II
指定宽度截取字符串
全自动化机器学习建模!效果吊打初级炼丹师!
In 2022, you still can't "low code"?Data science can also play with Low-Code!
4. Implementation Guide for GET_ENTITYSET Method of SAP ABAP OData Service Data Provider Class
ALBERT:A Lite BERT for Self-supervised Learning of Language Representations
Where is Naive Bayes "naive"?
Cobaltstrike和BurpSuite桌面快捷配置
Oracle问题: ORA-01882: 未找到时区
conda virtual environment | install and list problems