Clojure警告:“结果集-seq已存在于clojure.core中”

时间:2011-11-22 20:33:34

标签: clojure compojure noir

我是Clojure的新手并使用Noir框架构建一个Web应用程序(非常类似于Compojure,实际上我认为它是具有不同请求处理程序层的Compojure)。我在导入JDBC库时收到警告:

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)

3 个答案:

答案 0 :(得分: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只是稍微不那么干净,但仍然是一个非常好的方法(并且在它中断时很容易修复)。排除当前违规的绑定可能是解决问题的最不具备解决方法的方法,因为其他冲突的绑定可以随时出现,并追踪从哪里导入的内容可能很棘手。

答案 1 :(得分:3)

有很多选择。此警告的含义是,您正在使用不同包中的定义替换已定义的符号。在这种情况下,它看起来像是你定义的变量,对吧?如果是这样,最简单的解决方案可能就是在代码中重命名它。

或者,如果您不需要clojure.java.jdbc包中的resultset-seq,则可以将其排除:

(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 / resultset-seq

或者你可以:

(require 'clojure.java.jdbc)

然后使用clojure.java.jdbc / reusltset-seq

答案 2 :(得分:3)

除了其他优秀的答案之外,如果你想要jdbc resultset-seq而不是核心的,你可以将后者排除在当前的ns之外:

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