【问题标题】:how to get the column name list from a table in clojure如何从clojure中的表中获取列名列表
【发布时间】:2016-02-23 23:52:44
【问题描述】:

我正在使用 clojure.java.jdbc,并且想从表中获取列名列表,但是我应该如何在 clojure 中进行呢?我发现有一个result-set-read-column的功能,我想我可以使用它,但是我不完全理解这个功能,谁能举个例子?

【问题讨论】:

    标签: jdbc clojure metadata


    【解决方案1】:

    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)))
    

    【讨论】:

    • 只有在表格中至少有一行时才有效。如果表是空的,那么它就不起作用。
    • 是的。如果您想绕过 clojure.java.jdbc,您可以在 java ResultSet 上调用 .getMetaData,或者为您正在使用的数据库使用特定的 select 语句(例如,在 mysql 中选择表名)。
    【解决方案2】:

    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、查询向量和函数来处理结果集。请务必使用doallmapv 实现该函数中的所有内容,以防止延迟处理和在处理完成之前关闭结果集。

    (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-metadatametadata-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-queryJava DatabaseMetaData method call 的返回处理成 clojure 数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2019-12-31
      • 2010-10-01
      • 1970-01-01
      • 2011-12-03
      • 2012-05-02
      • 2022-01-04
      相关资源
      最近更新 更多