Журнал 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]