我正在使用clojure.java.jdbc,并希望从表中获取列名列表,但我应该如何在clojure中执行此操作?我发现有一个result-set-read-column的功能,我想我可以使用它,但我不完全理解这个功能,有没有人可以给出一个例子?
答案 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-resultset
或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"}
如果要在不使用查询的情况下查询数据库结构本身的元数据,可以使用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-metadata
将Java DatabaseMetaData method call的返回值处理为clojure数据结构。