【发布时间】:2016-02-23 23:52:44
【问题描述】:
我正在使用 clojure.java.jdbc,并且想从表中获取列名列表,但是我应该如何在 clojure 中进行呢?我发现有一个result-set-read-column的功能,我想我可以使用它,但是我不完全理解这个功能,谁能举个例子?
【问题讨论】:
我正在使用 clojure.java.jdbc,并且想从表中获取列名列表,但是我应该如何在 clojure 中进行呢?我发现有一个result-set-read-column的功能,我想我可以使用它,但是我不完全理解这个功能,谁能举个例子?
【问题讨论】:
result-set-read-columnis for transforming values,在这种情况下不是你想要的。
这是我现在能想到的最简单的方法:
(defn column-names [db table]
(let [rs (clojure.java.jdbc/query db (str "select * from " table " limit 1"))]
(-> rs first keys)))
【讨论】:
query 的:as-arrays? 选项将结果集作为数组返回,第一个数组是列名,下一个数组包含字段信息。这也适用于没有结果
(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-spec、查询向量和函数来处理结果集。请务必使用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的with-database-metadata和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"]
with-db-metadata 将 db-spec 的 DataBaseMetaData 绑定到 var,因此只需要评估一次,metadata-query 将 Java DatabaseMetaData method call 的返回处理成 clojure 数据结构。
【讨论】: