2011-11-22 38 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)) 
相关问题