本文介绍了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