我使用 VS Code Calva扩展编写 Clojure ,它使用clj-kondo对我的代码执行静态分析。
我正在使用HugSQL从 SQL 查询和语句创建 Clojure 函数。
我知道我可以处理数据库连接和 HugSQL 与conman之类的库的集成,事实上我过去使用过它并且我喜欢它,但这次我想保持原样并自己与 HugSQL 交谈。
HugSQL 的def-db-fns
宏接受一个 SQL 文件并根据该文件中包含的 SQL 查询和语句创建 Clojure 函数。
我下面的代码有效,但 clj-kondo 抱怨这seed-mytable!
是一个未解决的符号。
(ns my-app.db
"This namespace represents the bridge between the database world and the clojure world."
(:require [environ.core :refer [env]]
[hugsql.core :as hugsql]
[nano-id.core :refer [nano-id]]))
;; This create the function seed-mytable!, but clj-kondo doesn't (cannot?) know it.
(hugsql/def-db-fns "sql/mytable.sql")
;; The functions created by HugSQL can accept a db-spec, a connection, a connection pool,
;; or a transaction object. Let's keep it simple and use a db-spec for a SQLite database.
(def db-spec {:classname "org.sqlite.JDBC"
:subprotocol "sqlite"
:subname (env :database-subname)})
(defn db-seed
"Populate the table with some fakes."
[]
(let [fakes [[(nano-id) "First fake title" "First fake content"]
[(nano-id) "Second fake title" "Second fake content"]]]
;; clj-kondo complains that seed-my-table! is an unresolved symbol
(seed-mytable! db-spec {:fakes fakes})))
我理解为什么 clj-kondo 抱怨:seed-mytable!
没有在任何地方定义,它在调用def-db-fns
宏时被“注入”到这个命名空间中。
有没有办法告诉 clj-kondo 在调用hugsql/def-db-fns
宏之后符号确实存在?
可能它没那么有用,但这是我用 HugSQL 加载的 SQL 文件。
-- :name seed-mytable!
-- :command :execute
-- :result :affected
-- :doc Seed the `mytable` table with some fakes.
INSERT INTO mytable (id, title, content)
VALUES :t*:fakes;