簡體   English   中英

記錄 HugSQL 執行的 sql 語句/查詢

[英]Log sql statments/queries executed by HugSQL

我想記錄 HugSQL 執行的所有 SQL 字符串。 我查看了文檔,但找不到任何內容。 推薦的方式是什么?

我自己通過挖掘 hugsql 源代碼解決了這個問題。 它的工作原理類似於轉換生成函數的結果集 ( https://github.com/layerware/hugsql/issues/21 ):

(defn log-sqlvec [sqlvec]
  (log/info (->> sqlvec
              (map #(clojure.string/replace (or % "") #"\n" ""))
              (clojure.string/join " ; "))))

(defn log-command-fn [this db sqlvec options]
  (log-sqlvec sqlvec)
  (condp contains? (:command options)
    #{:!} (hugsql.adapter/execute this db sqlvec options)
    #{:? :<!} (hugsql.adapter/query this db sqlvec options)))

(defmethod hugsql.core/hugsql-command-fn :! [sym] `log-command-fn)
(defmethod hugsql.core/hugsql-command-fn :<! [sym] `log-command-fn)
(defmethod hugsql.core/hugsql-command-fn :? [sym] `log-command-fn)

根據 HugSQL 文檔:

HugSQL 生成內部稱為sqlvec的格式。 sqlvec格式是一個向量,在第一個位置包含一個 SQL 字符串,其中包含任何? 占位符,后跟要按位置順序應用於 SQL 的任意數量的參數值。

...

HugSQL 提供了hugsql.core/def-sqlvec-fns宏來創建返回sqlvec格式的函數。 默認情況下,創建的函數具有-sqlvec后綴,盡管可以使用:fn-suffix選項進行配置。 這些函數在開發/調試期間很有用,並且可以在不使用內置適配器數據庫函數執行查詢的情況下使用 HugSQL 的參數替換功能。

因此,您可以使用與您調用 HugSQL 函數的位置共存的函數的sqlvec版本來注銷將要執行的 SQL。

該文檔實際上提供了以下示例。 鑒於您已經像這樣加載了 HugSQL 查詢:

(ns princess-bride.db.characters
  (:require [hugsql.core :as hugsql]))

(hugsql/def-db-fns "princess_bride/db/sql/characters.sql")
(hugsql/def-sqlvec-fns "princess_bride/db/sql/characters.sql")

並給出以下函數調用:

(characters/characters-by-ids-specify-cols db
  {:ids [1 2], :cols ["name" "specialty"]}) 

您可以使用以下命令獲取生成的 sqlvec:

(characters/characters-by-ids-specify-cols-sqlvec
  {:ids [1 2], :cols ["name" "specialty"]})

這將返回如下內容:

["select name, specialty from characters
  where id in (?,?)",1,2]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM