我有一个函数,我得到一个表的名称和一个或多个列,并在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"]]} )
非常感谢任何帮助
答案 0 :(得分:2)
对于初学者(对于[i(:columns map)] i)与(:columns map)相同
您获得的异常是因为列是在序列中传入的,而不是作为create-table的单独args。
(apply j/create-table (:tablename map) (:columns map))
会做你想做的事。
将转弯列表应用到其函数参数的各个args中。