點燈坊

新しいことを始めるのに、遅すぎる挑戰はない

使用 sum 加總數值

Sam Xiao's Avatar 2021-10-22

sum 是實務上常見需求,這在 Knex 該如何寫呢 ?

Version

Knex 0.20.2
Knex-fp 0.0.8

SQL

select sum(price)
from books

sum 最常見的應用是對特定欄位做加總。

sum000

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,首先 plucksum field 資料,再使用 head[0] 取出。

Wink-fp

import { tug, log } from 'wink-fp'

mySQL ('books')
  .sum ({ sum: 'price' })
  .then (tug('sum'))
  .then (log)

由於 pluckhead 的組合經常使用,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。

sum001

Conclusion

  • 由於 Knex 回傳 Promise,可繼續使用 Ramda 以 pure function 處理
  • pluckhead 的組合經常使用,可改用 Wink-fp 的 tug 只要一個 function 即可
  • 也可使用 Knex-fp 的 sum,如此可使用 pipeK 組合 Knex-fp 與 Ramda、Wink-fp 的 function