2

我正在尝试编写一个简单的应用程序来读取数据库并生成一组用于访问它的函数;到目前为止,一切都很好。现在,我遇到的是我的数据库中的某些列被定义为 MySQL 枚举类型(例如ENUM('red','green','violet')),我想验证我发送到数据库的内容,而不是在不可接受的值时从驱动程序接收错误给出了,所以我想知道是否有一种方法可以从 clojure 中检索枚举的可能值。

我正在使用[clojure.java.jdbc "0.3.0-alpha5"][mysql/mysql-connector-java "5.1.25"]。为了获取我当前正在使用的表的元数据,但每次都java.sql.DatabaseMetaData尝试.getPseudoColumns给我。nil

4

1 回答 1

1

事实证明,没有直接的方法可以使用库来做到这一点。我自己的解决方案是:

(defn- parse-enum
  "Parses an enum string and returns it's components"
  [enum-str]
  ; "enum('temp','active','canceled','deleted')"
  (map (comp keyword #(.replace % "'" ""))
       (-> enum-str
           (.replaceFirst "^[^\\(]+\\(([^\\)]+)\\)$" "$1")
           (.split "'?,'?"))))

(defn get-enum-value 
  "Returns the values for an enum in a table.column"
  [table column]
  (jdbc/with-connection db
    (jdbc/with-query-results rs
      [(str "show columns from " table " where field = ?") column]
      ((comp set parse-enum :type first) rs))))
于 2013-10-14T10:10:34.277 回答