在clojure中使用MySQL enum数据类型访问

时间:2013-10-11 15:52:30

标签: java mysql clojure enums

我正在尝试编写一个简单的应用程序,它读取数据库并生成一组函数来访问它;到现在为止还挺好。现在,我遇到的是我的数据库中的一些列被定义为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

1 个答案:

答案 0 :(得分: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))))