點燈坊

失くすものさえない今が強くなるチャンスよ

使用 Knex 執行 Raw SQL Select

Sam Xiao's Avatar 2021-10-22

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,如此則可直接對 nthlog 加以組合。

select000

Conclusion

  • 若使用 Knex 產生的 SELECT,可直接讀取 data;但若是 raw sql 則 Knex 會多包一層,必須使用 [0] 才能取得 data
  • 自行抽出 raw 之後,也能使用 pipeP 直接組合 nthlog