2011-11-22 41 views
3

我是Clojure的新手,並使用Noir框架構建Web應用程序(與Compojure非常相似,事實上,我認爲它是Compojure與不同的請求處理程序層)。當我導入JDBC庫時,我收到一條警告:Clojure警告:「resultset-seq已經存在於clojure.core中」

WARNING: resultset-seq already refers to: #'clojure.core/resultset-seq in namespace: webapp.models.database, being replaced by: #'clojure.java.jdbc/resultset-seq 

我是否必須忍受這個警告或者是否有解決方法?我導入使用JDBC庫:

(use 'clojure.java.jdbc) 

回答

9

可以通過指定確切的綁定避免問題要導入:

(use '[clojure.java.jdbc :only [insert-values transaction]]) 
(transaction 
    (insert-values ...)) 

另一種選擇是:exclude違規綁定:

(use '[clojure.java.jdbc :exclude [resultset-seq]]) 
(transaction 
    (insert-values ...)) 

您也可以直接使用require代替:

(require '[clojure.java.jdbc :as db]) 
(db/transaction 
    (db/insert-values ...)) 

關於前向兼容性,require可以說是最安全的。使用:only只是稍微不太乾淨,但仍然是一個不錯的方法(並且在中斷時容易修復)。排除當前有問題的綁定可能是解決問題的最不能面向未來的方式,因爲其他有衝突的綁定可能隨時出現並追蹤從哪裏引入的內容可能會非常棘手。

+0

謝謝!我會試試看。如果我最終使用「:only」方法,它會影響查詢返回的結果集嗎? – Adam

+1

@Adam只要你沒有明確指出'resultset-seq'在任何地方,它應該沒有關係。在理論上,可以想象clojure.java.jdbc的一個宏擴展成了一個引用'resultset-seq'的東西,但它不太可能(即使這樣,我會考慮它)一個bug)。 –

+0

謝謝! 「要求:as」完美運作。 – Adam

3

有很多選擇。這個警告的含義是,你用一個來自不同包的定義來替換已經定義的符號。在這種情況下,它看起來像是你定義的變量,對吧?如果是這樣,最簡單的解決方案可能是在代碼中重命名它。

或者,如果你不需要從clojure.java.jdbc包中的結果,以次您可以排除:

(use '[clojure.java.jdbc :exclude (resultset-seq)]) 

或更好,但

(use '[clojure.java.jdbc :only (f1 f2 f3)]) 

其中F1,F2, f3是你實際需要的東西。

(use '[clojure.java.jdbc :as jdbc]) 

,然後使用JDBC /結果集-SEQ

或者你可以:

(require 'clojure.java.jdbc) 

,然後用clojure.java.jdbc/reusltset-SEQ

3

除其他優秀的答案,如果你想要jdbc resultset-seq而不是核心的,你可以排除後者被納入當前ns:

 
(ns foo 
    (:refer-clojure :exclude [resultset-seq]) 
    (:use clojure.java.jdbc)) 
相關問題