Egg.js是阿里巴巴开源的企业级Node.js框架。Egg.js相比Express和Koa,更轻量,是Koa的增强版,在开发成本和效率上更高效。Sequelize,是一个应用广泛的ORM框架,支持MySQL、PostgreSQL、SQLite、MSSQL等多种数据源。1.安装配置插件打开vscode终端安装egg-mysql,mysql2npminstall--saveegg-sequelizemysql2在config/plugin.js中导入egg-sequelize插件exports.sequelize={enable:true,package:'egg-sequelize',}在config/config.default.js中写入sequelize配置config.sequelize={dialect:'mysql',host:'123.45.67.890',port:3306,database:'test',username:'root',password:'123456',//配置数据库时间为东八区北京时间timezone:'+08:00',define:{//全局配置模型时间戳:true,//addcreate,update,deletetimestampsparanoid:true,//添加软删除freezeTableName:true,//防止修改表名pluralsunderscored:false//防止驼峰式字段默认下划线},//打印日志记录:true,//时间格式dialectOptions:{dateStrings:true,typeCast:true}};注意事项1、日期显示格式异常。默认情况下,查询日期类似于2022-01-02T09:14:03.102Z。我们需要自动格式化它。dialectOptions:{dateStrings:true,typeCast:true}这样会格式化成蒋子:2022-01-0410:39:562.模型配置模型是Sequelize的精髓。模型是表示数据库中表的抽象。在Sequelize中,它是Model的扩展类。Sequelize中的模型有一个名称,该名称不必与它在数据库中表示的表的名称相同。通常,模型具有单数名称(例如,User)而表具有复数名称(例如,Users),这是完全可配置的。我们首先在模型文件夹中创建一个parents.js文件来定义父模型:'usestrict';/***parenttable*/module.exports=app=>{const{STRING,INTEGER,UUID,NOW,DATE,UUIDV4}=app.Sequelize;constParents=app.model.define('Parents',{id:{type:UUID,primaryKey:true,allowNull:false,defaultValue:UUIDV4,comment:'parentid'},name:{type:STRING(36),allowNull:false,comment:'ParentName'},age:{type:INTEGER,allowNull:false,comment:'ParentAge'},createDate:{type:DATE,defaultValue:NOW,field:'create_date',评论:'creationtime'},updateDate:{type:DATE,defaultValue:NOW,field:'update_date',comment:'updatetime'}},{//去掉createAt,updateAttimestamps:false,//对应的表名到实例tableName:'parents'});返回父母;};是否修改表名为复数配置Squelize默认将Parents改为复数,即直接在Parentss中添加s,往往不是我们想要的,可以修改。1、在config.json文件中,添加如下配置,是全局的,避免在每个模型中修改设置。"define":{"freezeTableName":true}2、配置app.model.define的第三个参数config.json中已经配置好项目,模型已经注释掉。另外,我们可以在第三个参数tableName中配置我们想要的表名,加上默认值。更新或添加数据时,默认值是必需的。一般id、创建时间(create_date)、更新时间(updated_date)都设置了默认值。id:{defaultValue:UUIDV4},create_date:{defaultValue:NOW},update_date:{defaultValue:NOW}3.模型字段的数据类型这里只展示了部分数据类型,具体请参考文档。1.String(String)DataTypes.STRING//VARCHAR(255)DataTypes.STRING(36)//VARCHAR(36)DataTypes.TEXT//TEXT2,Boolean(布尔)DataTypes.BOOLEAN//TINYINT(1)3、数字(Number)DataTypes.INTEGER//INTEGERDataTypes.BIGINT(11)//BIGINT(11)DataTypes.FLOAT//FLOATDataTypes.FLOAT(11)//FLOAT(11)4、日期DataTypes.DATE//DATETIME适用于mysql/sqlite5,UUIDSequelize使用Sequelize.UUIDV1或Sequelize.UUIDV4生成UUID作为主键。{type:DataTypes.UUID,defaultValue:Sequelize.UUIDV4//orSequelize.UUIDV1}4.数据查询1.添加一个新的constparents=awaitParents.create({name:'WangDahammer'});parents实体的其他字段设置了默认值,会返回新增数据的实体。batchnewconstparents=awaitParents.bulkCreate({name:'王大锤'},{name:'山瓜瓜'});2.queryconstresult=awaitthis.ctx.model.Parents.findAll({limit:10,//当页数偏移量:0,//开始下标顺序:[['create_date','desc']],//排序规则where:{age:{[Op.gt]:36},name:{[Op.like]:'King%'}},attributes:[//指定返回的属性'id','name',//第一个参数为属性,第二个参数为别名,返回的数据Return['create_date','createDate']]}asanalias);OperatorSequelize提供了多种运算符,常用的都写在了例子中。其他的请参考文档。constresult=awaitthis.ctx.model.Parents.findAll({where:{age:{//[Op.gt]:36,//[Op.eq]:39,//=39//[Op.gt]:36,//[Op.eq]:39,//=39//[Op.ne]:39//!=39//[Op.gt]:32//>32//[Op..gt]:32//>=32//[Op.lt]:32//<32//[Op.lte]:32//<=32//[Op.between]:[32,35],//在32和35之间//[Op.notBetween]:[32,35],//不在32和35之间//[Op.in]:[36,38],//在[36,38]//[Op.notIn]:[36,38],//NOTIN[36,38]//组合//[Op.or]:{//[Op.lt]:36,//[Op.eq]:60//}},//Op.in简写//age:[32,39],使用`age:{[Op.in]:[32,39]}`name:{//[Op.like]:'王%',//[Op.like]:'%hat',//LIKE'%hat'//[Op.notLike]:'%hat',//NOTLIKE'%hat''//[Op.startsWith]:'hat',//LIKE'hat%'//[Op.endsWith]:'hat',//LIKE'%hat'},//Op.not实例//[Op.not]:[{//年龄:[36,37,38]//},{//name:{//[Op.like]:'王%'//}//}],create_date:{[Op.lt]:newDate(),[Op.gt]:newDate(newDate()-24*60*60*1000)}}});3.updateconsteffectedNum=awaitthis.ctx.model.Parents.update({name:'WangXiaohammer'},{where:{id:'123456789'}})4.删除consteffectedNum=awaitthis.ctx.model.Parents.destroy({where:'123456789'})5。countcount方法只统计数据库中元素出现的次数consteffectedNum=awaitthis.ctx.model.Parents。count({where:{age:{[Op.gt]:25}}})6,max,minandsumawaitthis.ctx.model.Parents.max('age');//63awaitthis.ctx.model.Parents.max('age',{where:{age:{[Op.lt]:40}}});//39awaitthis.ctx.model.Parents.sum('age');//10277,modellookup的查询方式会更加高效。findByPkfindByPk方法使用提供的主键从表中准确获取一个条目。等待this.ctx.model.Parents.findByPk('12');findOnefindOne方法获取它找到的第一个条目(可以满足提供的可选查询参数)。awaitProject.findOne({where:{age:40}});findAndCountAll在处理与分页相关的查询时很有用。const{count,rows}=awaitthis.ctx.model.Parents.findAndCountAll({where:{name:{[Op.like]:'King%'}},offset:10,limit:0});安慰。log(count);console.log(rows);communication永远可以相信光明,微信搜索【前端技术站】关注这位每天健身的程序员!
