4

我正在编写一个 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")))})))
4

1 回答 1

3

从最近添加的对答案的评论以及对问题文本的最新更新,我认为问题与 无关,而clojure.contrib.sqldefroutes表格有关。

(defroutes todo (GET "/" [] home-view))意味着匹配此路由的请求将home-view作为回复收到。Nowhome-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-the-function 将在每次触发路由时调用(并在每次此类调用时执行一次其 SQL 查询)。

于 2010-07-06T22:27:40.977 回答