2013-05-12 40 views
0

我有一個函數來獲取表名和一列或多列,並在postgres sql中創建表。我也創建了一個靜態版本來測試。靜態版本可以正常工作,但動態版本只有在我只寫一列作爲參數時才起作用。現在我試圖將多個列作爲arg引發異常。下面是代碼:通過Clojure JDBC動態創建表的函數不起作用

(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"]]}) 

任何幫助,將不勝感激

回答

2

對於初學者(對於[我(:柱圖)] i)爲與(:列映射)相同

您得到的異常是因爲列正在序列中傳遞,而不是作爲創建表的單獨參數。

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

會做你想做的。

將輪流列表應用到它的函數參數的各個參數中。

+0

謝謝你做的伎倆,我原本有(:列地圖),但在使用前,它仍然無法正常工作。我很感激它的噪音! – user1321988 2013-05-13 03:16:15