Предупреждение Clojure: "resultset-seq уже существует в clojure.ядро"


Я новичок в Clojure и создаю веб-приложение с использованием Noir framework (очень похоже на 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 3

3 ответа:

Вы можете избежать этой проблемы, указав точные привязки для импорта:

(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 просто немного менее чистый, но все же довольно хороший подход (и легко исправить, когда он ломается). Исключение в настоящее время нарушающих Привязок, вероятно, является наименее перспективным способом исправления проблема в том, что другие конфликтующие Привязки могут появиться в любое время и отслеживать, что импортируется откуда, может быть сложно.

Есть много вариантов. Это предупреждение означает, что вы заменяете уже определенный символ определением из другого пакета. В этом случае, похоже, что это переменная, которую вы определили, верно? Если это так, то самым простым решением может быть просто переименовать его в коде.

Или если вам не нужен resultset-seq от clojure.Ява.пакет 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.Ява.jdbc/reusltset-seq

В дополнение к другим отличным ответам, Если вы хотите получить JDBC resultset-seq вместо основного, Вы можете исключить последний из приведения в текущий ns:

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