4

我是 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)
4

3 回答 3

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只是稍微不那么干净,但仍然是一个很好的方法(并且在它中断时很容易修复)。排除当前有问题的绑定可能是解决问题的最不经得起未来考验的方法,因为其他冲突的绑定可能随时出现,并且跟踪从哪里导入的内容可能很棘手。

于 2011-11-22T20:52:29.167 回答
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/resultset-seq

或者你可以:

(require 'clojure.java.jdbc)

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

于 2011-11-22T20:56:46.010 回答
3

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

(ns 富
  (:refer-clojure :exclude [resultset-seq])
  (:使用clojure.java.jdbc))
于 2011-11-23T00:44:49.250 回答