Предупреждение Clojure: «resultset-seq уже существует в clojure.core» - PullRequest
3 голосов
/ 23 ноября 2011

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

9 голосов
/ 23 ноября 2011

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

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

3 голосов
/ 23 ноября 2011

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

(ns foo
  (:refer-clojure :exclude [resultset-seq])
  (:use clojure.java.jdbc))
3 голосов
/ 23 ноября 2011

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

Или, если вам не нужен resultset-seq из пакета 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

...