本文介绍了sequelize的CURD操作
查
find
1  | // search for known ids  | 
findOrCteate
有则查,无则创建
1  | User  | 
findAndCountAll
合并了findAll和count。当需要处理limit和offset并且需要计算总数时可以用它
返回带有两个属性的对象:
count- 整型,总数。rows- 数组,记录。
1  | Project  | 
支持includes。只有标记成required的才会统计到count。
假设你想查找所有有profile的user:
1  | User.findAndCountAll({  | 
因为 Profile 设置成了 required ,所以返回inner join,并且只有拥有profile的users才会统计到count。如果我们移除 required ,无论有没有profile,所有的users都将被计算入总数。include中添加 where 条件自动设置成require:
1  | User.findAndCountAll({  | 
上面的查询将值计算拥有active profile的user,因为当加入where条件时, required 被隐式的设置成了true。
传入 findAndCountAll的选项和下面的 findAll 相同。
findAll
1  | // find multiple entries  | 
复杂过滤条件
1  | Project.findOne({  | 
等价sql:
1  | SELECT *  | 
not 例子:
1  | Project.findOne({  | 
等价sql:
1  | SELECT *  | 
limit,offset,order 和 group
你可以使用limit, offset:
1  | // limit the results of the query  | 
group和order,他们语法相同:
1  | Project.findAll({order: [['title', 'DESC']]})  | 
注意上面两个例子,字符串会一字不差的传入到查询语句中而不经过转义,比如列名不会转义。当你传入一个字符串到order/group时,一直会这样处理。如果想转义列名,需要提供一个参数数组,即使你只想order/group一列。
1  | something.findOne({  | 
总结:order/group数组元素可以是:
- String - 直接引用
 - Array - 第一个元素直接引用,第二个逐字追加
 - Object -
- raw逐字追加,而不作为字符串
 - 如果raw未设置,其他的会被忽略,query失败
 
 - Sequelize.fn 和 Sequelize.col 返回functions和引用的列名
 
只获取原始数据
Sequelize返回的是带有update、delete等方法的model实例,如果有几千条数据,可能会比较耗时。如果只是需要展示数据而不需要更新等其他操作,可以使用如下方法:
1  | // Are you expecting a massive dataset from the DB,  | 
function
count
1  | Project.count().then(c => {  | 
max
1  | /*  | 
min
1  | /*  | 
sum
1  | /*  | 
只获取需要的列
attributes:
1  | Model.findAll({  | 
1  | SELECT foo, bar ...  | 
别名
1  | Model.findAll({  | 
1  | SELECT foo, bar AS baz ...  | 
使用函数作为列:
1  | Model.findAll({  | 
1  | SELECT COUNT(hats) AS no_hats ...  | 
当使用函数时,必须指定别名用来访问。如上方的例子,可以使用instance.get('no_hats')来获取帽子的数量。
如果需要所有的列,然后再加上一个函数的话,全写出来会很麻烦。
1  | Model.findAll({  | 
这时可以这样:
1  | // This is shorter, and less error prone because it still works if you add / remove attributes  | 
他们的sql都是:
1  | SELECT id, foo, bar, baz, quz, COUNT(hats) AS no_hats ...  | 
如果只想去除一列:
1  | Model.findAll({  | 
1  | SELECT id, foo, bar, quz ...  | 
where 条件
findAll/find 或者批量 updates/destroys ,可以使用where过滤。where