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))))

挿入されるアイテムの数に関係なく、同じ値を返します。もちろん、Web アプリを再起動すると、結果は更新されますが、これは本番環境にあまり適していないようです :)。

なぜこれが起こっているのでしょうか?前もって感謝します。

リクエストに応じて、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.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、ルートがトリガーされるたびに -the-function が呼び出されます (そして、そのような呼び出しごとに 1 回 SQL クエリを実行します)。

于 2010-07-06T22:27:40.977 に答える