代码之家  ›  专栏  ›  技术社区  ›  Dan Loewenherz Snowman

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

  •  4
  • Dan Loewenherz Snowman  · 技术社区  · 16 年前

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

    返回相同的值,无论插入多少项。当然,如果我重新启动web应用程序,结果会被更新,但这似乎对生产环境不太友好:)。

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

    (def home-view
      (render
        (base {:title "Clojure Todo"
               :content (apply str
                 (map #(% :name)
                   (sql-query "select * from todos")))})))
    
    1 回复  |  直到 16 年前
        1
  •  3
  •   Michał Marczyk    16 年前

    从最近添加的对答案的评论以及对问题文本的最新更新中,我发现问题与此无关 clojure.contrib.sql ,它和 defroutes 形式。

    (defroutes todo (GET "/" [] home-view)) 意味着匹配此路由的请求将收到 home-view 作为答复。现在 主视图 当 (def home-view ...) 对表单进行求值,尤其是关联的SQL查询只执行一次。

    要解决这个问题,重写 主视图

    (defn home-view []
      ...the render form from your old (def home-view ...) form goes here...
      )
    
    (defroutes todo (GET "/" [] (home-view)))
    

    主视图