sum
是實務上常見需求,這在 Knex 該如何寫呢 ?
Version
Knex 0.20.2
Knex-fp 0.0.8
SQL
select sum(price)
from books
sum
最常見的應用是對特定欄位做加總。
Knex
mySQL ('books')
.sum ('price as sum')
.then (x => x[0].sum)
.then (log)
但由於 SQL 是將 sum
放在 result set 內,因此必須在 then
中先以 [0]
取得第一筆資料,再使用 sum
取得。
mySQL ('books')
.sum ({ sum: 'price' })
.then (x => x[0].sum)
.then (log)
sum
也可改用 Object 形式較符合 ECMAScript 習慣。
Ramda
import { pluck, head } from 'ramda'
import { log } from 'wink-fp'
mySQL ('books')
.sum ({ sum: 'price' })
.then (pluck ('sum'))
.then (head)
.then (log)
也可在 then
中使用 Ramda 產生 pure function,首先 pluck
出 sum
field 資料,再使用 head
將 [0]
取出。
Wink-fp
import { tug, log } from 'wink-fp'
mySQL ('books')
.sum ({ sum: 'price' })
.then (tug('sum'))
.then (log)
由於 pluck
與 head
的組合經常使用,Wink-fp 提供了 tug
,只要傳入 sum
field 即可。
Knex-fp
import { pipeK, sum } from 'knex-fp'
import { tug, log } from 'wink-fp'
pipeK (
sum ({ sum: 'price' })
)(
tug ('sum'),
log
) (mySQL ('books'))
也可使用 Knex-fp 的 sum
,如此就可使用 pipeK()
同時組合 Knex-fp 與 Wink-fp 的 function。
Conclusion
- 由於 Knex 回傳 Promise,可繼續使用 Ramda 以 pure function 處理
pluck
與head
的組合經常使用,可改用 Wink-fp 的tug
只要一個 function 即可- 也可使用 Knex-fp 的
sum
,如此可使用pipeK
組合 Knex-fp 與 Ramda、Wink-fp 的 function