Knex 允許我們連 SELECT
也使用 Raw SQL,但回傳結果不太一樣。
Version
MySQL 8.0.18
Knex 0.20.0
SQL
SELECT *
FROM books
連 SELECT
都採用 raw sql,沒使用 Knex 產生。
Knex
mySQL.raw(SQL)
.then(x => x[0])
.then(console.log)
若 SELECT
使用 raw SQL,則 Knex 會多包一層 array,因此要 x[0]
才是真正資料。
Point-free
mySQL.raw (sql)
.then (nth(0))
.then (log)
若想讓 then
的 callback 也 Point-free,可以改用 Ramda 的 nth
與 Wink-fp 的 log
。
Pipeline
import { nth } from 'ramda'
import { log, pipeP } from 'wink-fp'
let raw = s => mySQL.raw (s)
pipeP (
raw,
nth (0),
log
) (sql)
由於 mySQL.raw
回傳 Promise,若要使用 Pipeline 寫法必須改用 Wink-fp 的 pipeP
,且將 mySQL.raw
改成 function 版的 raw
,如此則可直接對 nth
與 log
加以組合。
Conclusion
- 若使用 Knex 產生的
SELECT
,可直接讀取 data;但若是 raw sql 則 Knex 會多包一層,必須使用[0]
才能取得 data - 自行抽出
raw
之後,也能使用pipeP
直接組合nth
與log