通过Clojure JDBC动态创建表的功能不起作用

时间:2013-05-12 20:24:16

标签: jdbc clojure

我有一个函数,我得到一个表的名称和一个或多个列,并在postgres sql中创建表。我也创建了一个静态版本进行测试。静态版本工作正常,但动态verison仅在我编写它时才使用一列作为参数。现在,我正在尝试将多个列作为arg,它会引发异常。这是代码:

(require '[clojure.java.jdbc :as j]
       '[clojure.java.jdbc.sql :as s])


(def db
    {:classname "org.postgresql.Driver"
     :subprotocol "postgresql"
     :subname "mydb"
     :username "username"
     :password "password"})

    (defn StaticCreateTable
      []
    (j/with-connection db
        (j/create-table "records3" 
     ["RecID", "int", "PRIMARY KEY"]
     ["TreeID", "int"]
     ["Bubba", "varchar(30)"])
         (println "Success!")))

    (defn DynamicCreateTable2
      [map]
      (j/with-connection db
        (j/create-table (:tablename map) (for [i (:columns map)] i))
        (println "Success!")))

这是我输入的内容:

(DynamicCreateTable2 {:tablename "Creators3" 
:columns [
["CreatorID", "int", "PRIMARY KEY"]
["Number", "int"]]} )

非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

对于初学者(对于[i(:columns map)] i)与(:columns map)相同

您获得的异常是因为列是在序列中传入的,而不是作为create-table的单独args。

 (apply j/create-table (:tablename map) (:columns map))

会做你想做的事。

将转弯列表应用到其函数参数的各个args中。