Журнал sql статистики / запросов, выполненных HugSQL

Я хочу регистрировать все строки SQL, выполняемые HugSQL. Я просмотрел документы, но ничего не смог найти. Какой рекомендуемый способ?

2 ответа

Решение

Я решил это сам, копаясь в источнике 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 без использования встроенных функций базы данных адаптера для выполнения запросов.

Таким образом, вы могли бы использовать sqlvec версия функций, связанная с тем, где вы вызываете свои функции HugSQL для выхода из 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]
Другие вопросы по тегам