我正在编写一个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")))})))
答案 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查询)。