当前位置: 首页 > 后端技术 > Node.js

Sequelize中文文档v4-查询-查询

时间:2023-04-03 17:05:23 Node.js

查询-查询该系列文章的应用示例已发布在GitHub上:sequelize-docs-Zh-CN。您可以Fork以帮助改进或Star以关注更新。欢迎来到星空。Propertieswanttoonlyselect对于某些属性,可以使用attributes选项。通常传递一个数组:Model.findAll({attributes:['foo','bar']});SELECTfoo,bar...可以使用嵌套数组重命名属性:Model.findAll({attributes:['foo',['bar','baz']]});SELECTfoo,barASbaz...也可以使用sequelize.fn进行聚合:Model.findAll({attributes:[[sequelize.fn('COUNT',sequelize.col('hats')),'no_hats']]});SELECTCOUNT(hats)ASno_hats...使用聚合函数时,必须给它一个别名才能从模型中访问它。在上面的示例中,您可以使用instance.get('no_hats')来获取帽子的数量。如果您只想添加聚合,有时列出模型的所有属性可能会很烦人://这是获取帽子数量的烦人方式...Model.findAll({attributes:['id','foo','bar','baz','quz',[sequelize.fn('COUNT',sequelize.col('hats')),'no_hats']]});//这个更短,更少容易出错,因为如果您添加/删除attributesModel.findAll({attributes:{include:[[sequelize.fn('COUNT',sequelize.col('hats')),'no_hats']]}});SELECTid,foo,bar,baz,quz,COUNT(hats)ASno_hats...同样,它也可以去掉一些指定的属性:Model.findAll({attributes:{exclude:['baz']}});SELECTid,foo,bar,quz...Where无论您是通过findAll/find还是批量更新/销毁进行查询,您都可以传递一个where对象来过滤查询。where通常得到一个属性为:value键值对的对象,其中value可以是匹配等式的数据,也可以是其他算子的键值对象。复杂的AND/OR条件也可以通过or和and运算符的嵌套集生成。基础constOp=Sequelize.Op;Post.findAll({where:{authorId:2}});//SELECT*FROMpostWHEREauthorId=2Post.findAll({where:{authorId:12,status:'active'}});//SELECT*FROMpostWHEREauthorId=12ANDstatus='active';Post.destroy({where:{status:'inactive'}});//DELETEFROMpostWHEREstatus='inactive';Post.update({updatedAt:null,},{where:{deletedAt:{[Op.ne]:null}}});//更新帖子SETupdatedAt=nullWHEREdeletedAtNOTNULL;Post.findAll({where:sequelize.where(sequelize.fn('char_length',sequelize.col('status')),6)});//SELECT*FROMpostWHEREchar_length(status)=6;操作符Sequelize可用于创建更复杂比较的符号运算符-constOp=Sequelize.Op[Op.and]:{a:5}//且(a=5)[Op.or]:[{a:5},{a:6}]//(a=5或a=6)[Op.gt]:6,//id>6[Op.gte]:6,//id>=6[Op.lt]:10,//id<10[Op.lte]:10,//id<=10[Op.ne]:20,//id!=20[Op.eq]:3,//=3[Op.not]:true,//notTRUE[Op.between]:[6,10],//在6和10之间[Op.notBetween]:[11,15],//不在11和15之间[Op.in]:[1,2],//在[1,2]之间[Op.notIn]:[1,2],//不在[1,2][Op.like]:'%hat',//包含'%hat'[Op.notLike]:'%hat'//不包含'%hat'[Op.iLike]:'%hat'//包含'%hat'(不区分大小写)(仅限PG)[Op.notILike]:'%hat'//不包含'%hat'(仅限PG)[Op.regexp]:'^[h|a|t]'//匹配正则表达式/~'^[h|a|t]'(仅限MySQL/PG)[Op.notRegexp]:'^[h|a|t]'//不匹配正则表达式/!~'^[h|a|t]'(仅限MySQL/PG)[Op.iRegexp]:'^[h|a|t]'//~*'^[h|a|t]'(仅限PG)[Op.notIRegexp]:'^[h|a|t]'//!~*'^[h|a|t]'(仅限PG)[Op.like]:{[Op.any]:['cat','hat']}//包含任何数组['cat','hat']-也适用于iLike和notLike[Op.overlap]:[1,2]//&&[1,2](PG数组重叠运算符)[Op.contains]:[1,2]//@>[1,2](PG数组包含运算符)[Op.contained]:[1,2]//<@[1,2](操作符中包含的PG数组)[Op.any]:[2,3]//anyAnyarray[2,3]::INTEGER(PGonly)[Op.col]:'user.organization_id'//='user'.'organization_id',使用数据库语言特定的列标识符,此示例使用PGRangeOptionsSupported所有运算符都支持范围类型查询请记住,提供的范围值还可以定义绑定的包含/排除。//所有上记等和不等的操作符加上以下内容:[Op.contains]:2//@>'2'::integer(PGrangecontainselementoperator)[Op.contains]:[1,2]//@>[1,2)(PG范围包含范围运算符)[Op.contained]:[1,2]//<@[1,2)(PG范围包含在运算符中)[Op.overlap]:[1,2]//&&[1,2)(PG范围重叠(有共同点)运算符)[Op.adjacent]:[1,2]//-|-[1,2)(PG范围与运算符相邻)[Op.strictLeft]:[1,2]//<<[1,2)(PG范围严格在运算符左侧)[Op.strictRight]:[1,2]//>>[1,2)(PGrangestrictrightofoperator)[Op.noExtendRight]:[1,2]//&<[1,2)(PGrangedoesnotextendtotherightofoperator)[Op.noExtendLeft]:[1,2]//&>[1,2)(PG范围不延伸到运算符左侧)组合{rank:{[Op.or]:{[Op.lt]:1000,[Op.eq]:null}}}//rank<1000ORrankISNULL{createdAt:{[Op.lt]:newDate(),[Op.gt]:newDate(newDate()-24*60*60*1000)}}//createdAt<[timestamp]ANDcreatedAt>[timestamp]{[Op.or]:[{title:{[Op.like]:'船%'}},{description:{[Op.like]:'%boat%'}}]}//titleLIKE'Boat%'ORdescriptionLIKE'%boat%'operatoraliasSequelize允许设置特定的字符串别名对于运营商-constOp=Sequelize.Op;constoperatorsAliases={$gt:Op.gt}constconnection=newSequelize(db,user,pass,{operatorsAliases})[Op.gt]:6//>6$gt:6//等同于使用Op.gt(>6)运算符安全性使用不带任何别名的Sequelize可以提高安全性有些框架会自动将用户输入解析为js对象,如果您无法对输入进行清理,则可以使用字符串运算符到Sequelize。没有任何字符串别名会使操作符不太可能被注入,但您应该始终正确验证和清理用户输入。出于向后兼容的原因,Sequelize默认设置以下别名-$eq,$ne,$gte,$gt,$lte,$lt,$not,$in,$notIn,$is,$like,$notLike,$iLike,$notILike,$regexp,$notRegexp,$iRegexp,$notIRegexp,$between,$notBetween,$overlap,$contains,$contained,$adjacent,$strictLeft,$strictRight,$noExtendRight,$noExtendLeft,$and,$or,$any,$all,$values,$col当前,还设置了以下遗留别名,但计划在不久的将来完全删除-ne,not,in,notIn,gte,gt,lte,lt,like,ilike,$ilike,nlike,$notlike,notilike,..,between,!..,notbetween,nbetween,overlap,&&,@>,<@为了更好的安全性,建议改用Sequelize.Op依赖任何String别名。您可以通过设置operatorsAliases选项来限制您的应用程序需要的别名,记住要清理用户输入,尤其是当您将它们直接传递给Sequelize方法时。constOp=Sequelize.Op;//使用不带任何运算符别名的sequelizeconstconnection=newSequelize(db,user,pass,{operatorsAliases:false});//仅使用$and=>Op.and运算符别名sequelizeconstconnection2=newSequelize(db,user,pass,{operatorsAliases:{$and:Op.and}});如果您使用默认别名并且不限制它们,Sequelize会警告您。如果你想在没有警告的情况下继续使用所有默认别名(不包括旧别名),你可以传递以下运算符参数-constOp=Sequelize.Op;constoperatorsAliases={$eq:Op.eq,$ne:Op.ne,$gte:Op.gte,$gt:Op.gt,$lte:Op.lte,$lt:Op.lt,$not:Op.not,$in:Op.in,$notIn:Op.notIn,$is:Op.is,$like:Op.like,$notLike:Op.notLike,$iLike:Op.iLike,$notILike:Op.notILike,$regexp:Op.regexp,$notRegexp:Op.notRegexp,$iRegexp:Op.iRegexp,$notIRegexp:Op.notIRegexp,$between:Op.between,$notBetween:Op.notBetween,$overlap:Op.overlap,$contains:Op.contains,$contained:Op.contained,$相邻:Op.adjacent,$strictLeft:Op.strictLeft,$strictRight:Op.strictRight,$noExtendRight:Op.noExtendRight,$noExtendLeft:Op.noExtendLeft,$and:Op.and,$or:Op.or,$any:Op.any,$all:Op.all,$values:Op.values,$col:Op.col};constconnection=newSequelize(db,user,pass,{operatorsAliases});JSONBJSONB可以通过三种不同的方式进行查询。嵌套对象{元:{视频:{url:{[Op.ne]:null}}}}嵌套键{“meta.audio.length”:{[Op.ne]:20}}包装器{“元”:{[Op.contains]:{site:{url:'http://google.com'}}}}Relation/Association//查找至少有一个任务的所有项目,其中task.state===project.stateProject.findAll({include:[{model:Task,where:{state:Sequelize.col('project.state')}}]})pagination/limit//get10instances/rowsProject.findAll({limit:10})//跳过8个实例/行Project.findAll({offset:8})//跳过5个实例,然后取5Project.findAll({offset:5,limit:5})sortorder取一个条目数组对查询或sequelize方法进行排序。通常,您需要使用任一属性的元组/数组,并确定排序的方向。Subtask.findAll({order:[//用户名将被转义并根据有效的方向参数列表进行验证DESC['title','DESC'],//将按最大(年龄)排序sequelize.fn('max',sequelize.col('age')),//将按max(age)DESC排序[sequelize.fn('max',sequelize.col('age')),'DESC'],//将排序byotherfunction(`col1`,12,'lalala')DESC[sequelize.fn('otherfunction',sequelize.col('col1'),12,'lalala'),'DESC'],//将使用模型//Willorderthroughanassociatedmodel'screated_atusingthemodelnamesastheassociations'names.[Task,Project,'createdAt','DESC'],//将使用关联名称按关联模型的created_at排序。['Task','createdAt','DESC'],//将使用关联名称按嵌套关联模型的created_at排序。['Task','Project','createdAt','DESC'],//将使用关联对象按关联模型的created_at进行排序。(首选方法)[Subtask.associations.Task,'createdAt','DESC'],//将使用关联对象按嵌套关联模型的created_at进行排序。(首选方法)[Subtask.associations.Task,Task.associations.Project,'createdAt','DESC'],//将使用简单关联对象按关联模型的created_at排序。[{model:Task,as:'Task'},'createdAt','DESC'],//created_at嵌套关联模型的简单关联对象排序[{model:Task,as:'Task'},{model:Project,as:'Project'},'createdAt','DESC']]//将按最大年龄值降序排列order:sequelize.literal('max(age)DESC')//将排列在按最大年龄值升序,省略排序条件时,默认为升序:order:sequelize.fn('max',sequelize.col('age'))//默认为升序排序用于省略排序标准顺序:sequelize.col('age')})如果本文对您有帮助,感谢下方支持或StarGitHub:sequelize-docs-Zh-CN,谢谢。