1.模型了解
介绍:
模型是Sequelize的本质,模型是代表数据库中表的抽象,是我们操作数据库表的重要实质.在sequelize中,它是一个model的扩展类.
该模型告诉sequelize有关它代表的实体的几件事,列如,数据库中表的名称以及它具有的字段及其数据类型(即,通过模型我们可以创建在数据库中创建相应的表及其所拥有的字段以及字段类型.)
Sequelize中的模型有一个名称,此名称不必与它在数据库中表示的表的名称相同,通常,模型具有单数名称(例如: User ),而表具有复数名称(例如: Users),我们也可以自定义表名
(1)创建模型(即创建数据库表的结构)
模型的创建有两种方式
方法一:
调用
sequelize实例对象.define(‘表名’,{表的字段配置},{模型相关配置})
方法二:
(1)扩展model(即通过从sequelize模块中引入Model),
(2)调用 init({表的字段配置},{模型相关配置}) 方法
方法一:
const { Sequeliz }=require('sequelize'); // 引入sequelize模块
// 创建实例对象并连接数据库
const db=new Sequelize('数据库名','用户名','密码',{
dialect:'mysql', // 数据库类型,支持: 'mysql', 'sqlite', 'postgres', 'mssql'
host:'localhost', // 自定义连接地址,可以是ip或者域名,默认为本机:localhost
port:'3306', // 端口号,默认为3306
logging:true, // 是否开启日志(建议开启,有利于我们查看进行的操作)
pool:{ // 连接池
min:0,
max:5,
idle:30000,
acquire:60000,
}
})
// 创建模型语法
const 模型名称=实例对象.define(
'表名',
{
....表中的字段内容配置
},
{
...模型其他配置
}
)
// 创建模型实例
const User=db.define(
'Users',
{
id:{
type:Sequelize.INTEGER(11),
primaryKey:true, // 是否主键
autoIncrement:true, // 是否自增
},
username:Sequelize.STRING,
passwrod:Sequelize.STRING,
},
{
timestamps:false, // 是否自动监听并创建字段的创建、更新等字段时间点
}
)
方法二:
目前还不会,后面学了再说…
(2)根据模型生成相应的数据库表
注意:必须先创建好模型.
当我们创建好模型后,我们就可以通过相关函数生成相应的表了.
我们有三个可选函数能够根据函数进行相关的表生成判断.
表的生成函数,可选函数,根据需求选择其中之一即可:
(1) 实例对象.sync() ; // 若表不存在,则创建表;若表已经存在,则不做任何操作
(2) 实例对象.sync({force:true}); // 若表不存在,则创建相应的表;若表已经存在,则删除原来的表,重新创建一个新的表.
(3) 实例对象.sync({alter:true}); // 若表不存在,则创建相应的表;若表已经存在,则与原始表进行比对,将原始表比对修改为当前的模型表
....
const db=new Sequelize(......);
const 模型名称=db.define('表名',{...表配置},{...其他配置});
db.sync().then(()=>{
console.log('表创建成功')
}).catch(err=>{
console.log('创建失败'+err)
})
表的删除我们通过drop函数来进行操作
drop函数有两种使用方式
方式一:
// 删除指定表
模型名称(即表名).drop().then(()=>console.log(‘删除成功’)).catch(err=>console.log(‘删除失败’))
方式二:
// 删除数据库中的所有表
实例对象.drop().then(()=>console.log(‘删除成功’)).catch(err=>console.log(‘删除失败’))
其他条件操作符(用于进行条件判断或其他操作时使用)
注意:从sequelize中引入Op核心
const { Op } = require("sequelize");
Post.findAll({
where: {
[Op.and]: [{ a: 5 }, { b: 6 }], // (a = 5) AND (b = 6)
[Op.or]: [{ a: 5 }, { b: 6 }], // (a = 5) OR (b = 6)
someAttribute: {
// 基本
[Op.eq]: 3, // = 3
[Op.ne]: 20, // != 20
[Op.is]: null, // IS NULL
[Op.not]: true, // IS NOT TRUE
[Op.or]: [5, 6], // (someAttribute = 5) OR (someAttribute = 6)
// 使用方言特定的列标识符 (以下示例中使用 PG):
[Op.col]: 'user.organization_id', // = "user"."organization_id"
// 数字比较
[Op.gt]: 6, // > 6
[Op.gte]: 6, // >= 6
[Op.lt]: 10, // < 10
[Op.lte]: 10, // <= 10
[Op.between]: [6, 10], // BETWEEN 6 AND 10
[Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15
// 其它操作符
[Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)
[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.startsWith]: 'hat', // LIKE 'hat%'
[Op.endsWith]: 'hat', // LIKE '%hat'
[Op.substring]: 'hat', // LIKE '%hat%'
[Op.iLike]: '%hat', // ILIKE '%hat' (不区分大小写) (仅 PG)
[Op.notILike]: '%hat', // NOT ILIKE '%hat' (仅 PG)
[Op.regexp]: '^[h|a|t]', // REGEXP/~ '^[h|a|t]' (仅 MySQL/PG)
[Op.notRegexp]: '^[h|a|t]', // NOT REGEXP/!~ '^[h|a|t]' (仅 MySQL/PG)
[Op.iRegexp]: '^[h|a|t]', // ~* '^[h|a|t]' (仅 PG)
[Op.notIRegexp]: '^[h|a|t]', // !~* '^[h|a|t]' (仅 PG)
[Op.any]: [2, 3], // ANY ARRAY[2, 3]::INTEGER (仅 PG)
// 在 Postgres 中, Op.like/Op.iLike/Op.notLike 可以结合 Op.any 使用:
[Op.like]: { [Op.any]: ['cat', 'hat'] } // LIKE ANY ARRAY['cat', 'hat']
// 还有更多的仅限 postgres 的范围运算符,请参见下文
}
}
});
更多相关操作请看官网:模糊查询基础
2.通过Sequelize实现数据库表内容的CRUD
所谓CRUD即我们常说的增加(Create)、检索(Retrieve)、更新(Update)、删除(Delete).
(1)增加操作(Create).
sequelize进行的增加操作我们通过create函数和bulkCreate函数来进行.
create函数每次只能插入一条数据,用来做单个数据插入处理
语法:
模型名称(即表名).create({
…需要往数据库表中添加的内容
})
例如:
// 配置模型
const users=db.define('users',{
id:{
type:Sequelize.INTEGER(11),
primaryKey:true,
autoIncrement:true,
},
username:Sequelize.STRING,
password:Sequelize.STRING,
},{
timestamps:false,
});
// 创建表
db.sync({force:true}).then(()=>console.log('表创建')).catch(err=>console.log(err))
// 向表中添加数据
users.create({
username:'XioaHong',
password:'1242345',
}).then(()=>console.log('添加成功')).catch(err=>console.log('添加失败'))
bulkCreate函数用于批量插入数据
语法:
模型名称(表名).bulkCreate([…批量插入的数据])
案例:
// 配置模型
const users=db.define('users',{
id:{
type:Sequelize.INTEGER(11),
primaryKey:true,
autoIncrement:true,
},
username:Sequelize.STRING,
password:Sequelize.STRING,
},{
timestamps:false,
});
// 创建表,sync({force})用于重新创建一个全新的表
db.sync({force:true}).then(()=>console.log('表创建')).catch(err=>console.log(err))
users.bulkCreate([
{username:'XiaoMing',password:'123456789'},
{username:'XiaoLi',password:'000000000'},
{username:'XiaoHong',password:'11111111'},
.....
]).then(()=>console.log('添加成功')).catch(err=>console.log('添加失败'))
(2)查询操作(Retrieve)
sequelize中支持查询的函数有多个:
findAll({…可选查询配置}) 函数方法
若没有查询条件,则该函数用于从数据库中读取整个表的内容;若存在查询条件,则该函数返回查询到的内容.
可选配置条件有where属性以及attribute属性等
where:{
… 根据条件进行查询
}
或
attribute:[‘字段1’,‘字段2’,…,‘字段n’] // 更具表中的字段进行查询
findOne({…可选查询配置}) 函数方法
若没有配置查询条件,则该函数默认返回指定表中的第一条数据;若存在查询配置,则返回指定查询条件的数据
可选配置条件有where属性以及attribute属性等
where:{
… 根据条件进行查询
}
或
attribute:[‘字段1’,‘字段2’,…,‘字段n’] // 更具表中的字段进行查询
findByPk(option)函数方法
该函数方法根据指定表中的键名进行查询返回指定键名所在的数据.
findOrCreate({…查询条件,defaults:{…默认创建的表数据}})
注意:
该方法根据查询条来进行查询,若找到符合查询条件的内容,则将内容返回出来.
若是没有找到符合查询条件的内容,则将根据defaluts参数设置的默认数据创建一个新的数据在表中,并将该数据返回出来.
除非找到一个满足查询参数的结果,否则方法
findOrCreate
将在表中创建一个条目. 在这两种情况下,它将返回一个实例(找到的实例或创建的实例)和一个布尔值,指示该实例是已创建还是已经存在.使用
where
参数来查找条目,而使用defaults
参数来定义必须创建的内容. 如果defaults
不包含每一列的值,则 Sequelize 将采用where
的值(如果存在).// 若是找到id为4的数据,则将该数据返回;若是没有找到id为是的数据,则创建一个id为4的数据,其他字段内容为defaults中的字段及其内容,并将其作为查询数据返回.
模型名称(表名).findOrCreate(
{
where:{
id:4,
},
defaults:{
username:‘XiaoMing’,
password:‘1213242345’,
create_time:new Date()
}
}
)
findAndCountAll({…可选查询条件,offset:设置查询过滤的数据条数,limit:设置返回的数据条数})
语法:
模型名称(表名).findAndCountAll(
{
where:{
…若存在查询条件,则从满足查询条件的数据中进行返回;若不存在查询条件,则从所有数据中进行返回
},
limit:每页数据要展示的条数,
offset:(页数-每页要展示数据条数)*每页数据要展示的条数,
}
)
例如:
const users=db.define('users',{
id:{
type:Sequelize.INTEGER(11),
primaryKey:true,
autoIncrement:true,
},
username:Sequelize.STRING,
password:Sequelize.STRING,
},{timestamps:false})
// 使用findAll函数
// 查询表中的所有内容
users.findAll().then(async res=>{
console.log(await JSON.stringify(res))
}).catch(err=>console.log(err))
users.findAll({
attribute:['id','username']; // 查询表中的所有数据的id以及username字段内容
或者
where:{
id:4 // 查询表中id为4的数据
}
}).then(async res=>{
console.log(await JSON.stringify(res))
}).catch(err=>console.log(err))
// 使用findOne函数
// 默认返回表中的第一条数据
users.findOne().then(async res=>{
console.log(await JSON.stringify(res))
}).catch(err=>console.log(err))
users.findOne({
attribute:['id','username']; // 查询表中的所有数据的id以及username字段内容
或者
where:{
id:4 // 查询表中id为4的数据
}
}).then(async res=>{
console.log(await JSON.stringify(res))
}).catch(err=>console.log(err))
// findByPk函数
// 查询表中键名为4的数据
users.findByPk(4).then(async res=>{
console.log(await JSON.stringify(res))
}).catch(err=>console.log(err))
// findOrCreate函数
// 若是找到id为4的数据,则将该数据返回;若是没有找到id为4的数据,则创建一个id为4的数据,其他字段内容为defaults中的字段及其配置内容,并将其作为查询数据返回.
Users.findOrCreate({
where:{
id:4
},
defaults:{
username:'XiaoHei',
password:'214234255',
create_time:new Date()
}
})
// findAndCountAll函数
// 查询查询第二页数据,每页数据为3条
const page=2; // 第二页
Users.findAndCountAll(
{
where:{},
limit:3, // 展示三条数据
offset:(2-1)*3; // 因为是第二页,所以过滤掉第一页的三条数据,从第四条数据开始.
}
)
(3)修改操作(Update)
sequelize中进行表数据的更新操作我们可以通过函数update进行.
语法:
模型名称(表名).update({需要更新的内容及其新的值},{...查询指定需要更新的数据})
注意:
该函数修改成功后返回值为1,若是修改失败则返回值为0.
案例:
// 创建模型
const Users=db.define('users',{
....字段配置及其类型,默认值配置.
})
// 创建表
db.sync()
.... 其他相关操作
// 查询id为4的数据,将其字段username值改为XiaoZhang,字段password值改为123456789
Users.update(
{
username:'XiaoZhang',
password:'123456789'
},
{
where:{
id:4,
}
}
)
(4)删除操作(delete)
sequelize中的删除操作我们通过destroy函数.
语法:
模型名称(表名).destroy(
where:{…根据条件指定要删除的数据}
)
案例:
const Users=db.define('users',{
....表中的字段及其类型,默认值等等配置
})
// 表创建
db.sync();
....表数据插入操作
// 进行数据删除操作
Users.destroy({ // 删除表users中id为4的数据
where:{
id:4
}
})