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