由HugSQL

时间:2017-10-31 12:20:22

标签: logging clojure hugsql

我想记录HugSQL执行的所有SQL字符串。我查看了文档,但无法找到任何内容。什么是推荐的方式?

2 个答案:

答案 0 :(得分:6)

我通过挖掘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)

答案 1 :(得分:2)

根据HugSQL文档:

  

HugSQL生成一种内部称为 sqlvec 的格式。 sqlvec 格式是一个向量,其第一个位置包含任何class GUI(QWidget, Ui_DynoTest1): def __init__(self, parent=None): [...] self.thread.start() self.torque = [] self.horse_power = [] layout = QHBoxLayout() self.plot = pg.PlotWidget() layout.addWidget(self.plot) self.graphicsView.setLayout(layout) self.p1 = self.plot.plotItem self.p1.setLabels(left='Torque') self.TorqueCurve = self.p1.plot() self.TorqueCurve.setPen(pg.mkPen(color="#ff0000", width=2)) self.p2 = pg.ViewBox() self.HorsePowerCurve = pg.PlotCurveItem() self.HorsePowerCurve.setPen(pg.mkPen(QColor(0, 255, 0)), width=2) self.p2.addItem(self.HorsePowerCurve) self.p1.scene().addItem(self.p2) self.p1.showAxis('right') self.p1.getAxis('right').setLabel('HorsePower', color='#0000ff') self.p1.getAxis('right').linkToView(self.p2) self.p1.vb.sigResized.connect(self.updateViews) def updateViews(self): self.p2.setGeometry(self.p1.vb.sceneBoundingRect()) self.p2.linkedViewChanged(self.p1.vb, self.p2.XAxis) def onDataChanged(self, Force, RPM, Max_RPM, Torque, Max_Torque, HorsePower, Max_HorsePower, Run_Time): [...] if len(self.torque) < 50: self.torque.append(Torque) else: self.torque = self.torque[1:] + [Torque] if len(self.horse_power) < 50: self.horse_power.append(HorsePower) else: self.horse_power = self.horse_power[1:] + [HorsePower] self.TorqueCurve.setData(self.torque) self.HorsePowerCurve.setData(self.horse_power) self.updateViews() 占位符的SQL字符串,后跟按位置顺序应用于SQL的任意数量的参数值。

     

...

     

HugSQL提供?宏来创建返回 sqlvec 格式的函数。默认情况下,创建的函数具有hugsql.core/def-sqlvec-fns后缀,但可以使用-sqlvec选项进行配置。这些函数在开发/调试期间以及使用HugSQL的参数替换功能而不使用内置适配器数据库函数来执行查询时非常有用。

因此,您可以使用与调用HugSQL函数的位置共存的函数的:fn-suffix版本来注销将要执行的SQL。

doc实际上提供了以下示例。鉴于你已经加载了这样的HugSQL查询:

sqlvec

并给出以下函数调用:

(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")

您可以使用以下内容获取生成的sqlvec:

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

会返回类似的内容:

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