我是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)
答案 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))