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

时间:2016-02-23 23:52:44

标签: jdbc clojure metadata

我正在使用clojure.java.jdbc,并希望从表中获取列名列表,但我应该如何在clojure中执行此操作?我发现有一个result-set-read-column的功能,我想我可以使用它,但我不完全理解这个功能,有没有人可以给出一个例子?

2 个答案:

答案 0 :(得分:2)

result-set-read-column is for transforming values,在这种情况下不是您想要的。

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

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

答案 1 :(得分:1)

:as-arrays?的{​​{1}}选项将结果集作为数组返回,第一个数组是列名,下一个数组包含字段信息。这也没有结果

query

如果您想自己处理结果集,可以使用(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-spec,查询向量和函数来处理结果集。请确保使用db-with-resultsetdoall实现该函数中的所有内容,以防止延迟处理,并在处理完成之前关闭结果集。

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"}

如果要在不使用查询的情况下查询数据库结构本身的元数据,可以使用clojure.java.jdbc中的(j/query db-spec ["select TOP 0 surname, first-name from person"] :as-arrays? true) [[:surname :first-name]] with-database-metadata。以下内容将给出" person"中的所有列名。表:

metadata-query

(j/with-db-metadata [m db-spec] (->> (.getColumns m "mycatalog" nil "person" nil) (j/metadata-query) (map :column_name))) ["surname" "first-name" "age" "gender"] 将db-spec的DataBaseMetaData绑定到var,因此只需要评估一次,with-db-metadataJava DatabaseMetaData method call的返回值处理为clojure数据结构。