Compojure + clojure.contrib.sql:正在缓存SELECT查询。为什么?

时间:2010-07-01 22:00:57

标签: sql mysql clojure compojure clojure-contrib

我正在编写一个Compojure TODO应用程序,并将MySQL作为主要数据存储。我正在使用clojure.contrib.sql与MySQL连接,如下所示:

(def db {:classname "com.mysql.jdbc.Driver"
         :subprotocol "mysql"
         :subname "//localhost:3306/todo"
         :user "<user>"
         :password ""})

我正在使用的查询似乎有效,但结果似乎是缓存的。例如,运行后

(with-connection db
  (insert-values :todos
    [:name] [name]))

该值已成功插入数据库。然而,

(defn sql-query [query]
  (with-connection db
    (with-query-results rows [query]
      (into [] rows))))
无论插入多少项,

都会返回相同的值。当然,如果我重新启动网络应用程序,结果会更新,但这似乎不太适合生产:)。

知道为什么会这样吗?提前谢谢。

根据要求,这是SELECT查询的顶级表单:

(def home-view
  (render
    (base {:title "Clojure Todo"
           :content (apply str
             (map #(% :name)
               (sql-query "select * from todos")))})))

1 个答案:

答案 0 :(得分:3)

根据最近添加的答案评论以及问题文本的最新更新,我收集到问题与clojure.contrib.sql无关,而是defroutes形式。

(defroutes todo (GET "/" [] home-view))表示匹配此路由的请求将收到home-view作为回复。现在home-view仅在评估(def home-view ...)表单时评估一次 - 特别是,关联的SQL查询只执行一次。

要解决此问题,请将home-view重写为函数并让路径调用它,或许是这样:

(defn home-view []
  ...the render form from your old (def home-view ...) form goes here...
  )

(defroutes todo (GET "/" [] (home-view)))

然后home-view - 每次触发路由时都会调用该函数(并在每次调用时执行一次SQL查询)。