【问题标题】:Function to Dynamically Create-Table via Clojure JDBC Not working通过 Clojure JDBC 动态创建表的功能不起作用
【发布时间】:2013-05-12 20:24:15
【问题描述】:

我做了一个函数来获取表的名称和一个或多个列,并在 postgres sql 中创建表。我也创建了一个静态版本来测试。静态版本可以正常工作,但是动态版本仅在我编写它只是为了将一列作为参数时才有效。现在我正在尝试将多个列作为 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"]]} )

任何帮助将不胜感激

【问题讨论】:

    标签: jdbc clojure


    【解决方案1】:

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

    你得到的例外是因为列是在一个序列中传递的,而不是作为单独的参数来创建表。

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

    会做你想做的。

    apply 将列表转换为单独的 args 到其函数参数。

    【讨论】:

    • 谢谢你成功了,我原来有 (:columns map) 但在使用 apply 之前它仍然无法正常工作。我很感激噪音史密斯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多