Jdbc 如何从clojure中的表中获取列名列表

Jdbc 如何从clojure中的表中获取列名列表,jdbc,clojure,metadata,Jdbc,Clojure,Metadata,我正在使用clojure.java.jdbc,希望从表中获取列名列表,但是我应该如何在clojure中实现呢?我发现有一个result set read column函数,我想我可以使用它,但我不完全理解这个函数,有人能举个例子吗?result set read column,这不是您想要的 这是我现在能想到的最简单的方法: (defn column-names [db table] (let [rs (clojure.java.jdbc/query db (str "select * fr

我正在使用clojure.java.jdbc,希望从表中获取列名列表,但是我应该如何在clojure中实现呢?我发现有一个result set read column函数,我想我可以使用它,但我不完全理解这个函数,有人能举个例子吗?

result set read column
,这不是您想要的

这是我现在能想到的最简单的方法:

(defn column-names [db table]
  (let [rs (clojure.java.jdbc/query db (str "select * from " table " limit 1"))]
    (-> rs first keys)))

查询的
:as array?
选项将结果集作为数组返回,第一个数组是列名,下一个数组包含字段信息。这也没有结果

(j/query db-spec
         ["select TOP 1 * from person"]
         :as-arrays? true)

[[:surname :first-name :age :gender]
 ["Doe" "John" 32 "male"]]

(j/query db-spec
         ["select TOP 0 * from person"]
         :as-arrays? true)

[[:surname :first-name :age :gender]]
如果您想自己处理结果集,可以使用
db with resultset
,它采用db规范、查询向量和函数来处理结果集。确保使用
doall
mapv
实现该函数中的所有内容,以防止延迟处理和在处理完成之前关闭结果集

(defn get-field-info
  [rs]
  (let [m (.getMetaData rs)]
    (into {} (mapv (fn [c] [(.getColumnName m c)
                            (.getColumnTypeName m c)])
                   (range 1 (inc (.getColumnCount m)))))))


(j/db-query-with-resultset db-spec
                           ["select TOP 0 * from person"]
                           get-field-info)

{"surname" "nvarchar","first-name" "nvarchar","age" "int","gender" "nvarchar"}
请注意,这些选项只返回查询结果集的元数据,而不是表本身的元数据

(j/query db-spec
         ["select TOP 0 surname, first-name from person"]
         :as-arrays? true)

[[:surname :first-name]]
如果要在不使用查询的情况下查询数据库结构本身的元数据,可以使用clojure.java.jdbc中的
元数据查询
。下面将给出“person”表中的所有列名:


带有db metadata的
将db规范的DataBaseMetaData绑定到var,因此只需对其求值一次,
元数据查询
将返回的数据处理到clojure数据结构中。

仅当表中至少有一行时才起作用。如果表是空的,那么它就不能工作。如果要绕过clojure.java.jdbc,可以在java结果集上调用.getMetaData,或者对正在使用的数据库使用特定的select语句(例如mysql中的select table name)。
(j/with-db-metadata [m db-spec]
                    (->> (.getColumns m "mycatalog" nil "person" nil)
                         (j/metadata-query)
                         (map :column_name)))

["surname" "first-name" "age" "gender"]