Подтвердить что ты не робот

Используйте базу данных с Clojure

Какие существуют методы использования базы данных из Clojure?

Я знаю, что из Clojure вы можете делать все, что можете, с помощью Java, но это означает, что я могу использовать что-то слишком сложное (например, Hibernate), которое сталкивается с простотой Clojure. Любые рекомендации или комментарии?

4b9b3361

Ответ 1

clojure-contrib имеет библиотеку sql, которая представляет собой тонкую оболочку вокруг JDBC (java.sql.DriverManager). В тестовом файле, который поставляется с ним, есть некоторые примеры его использования.

Ответ 2

Теперь я (по состоянию на конец 2011 года) рекомендую Korma - "Вкусный SQL для Clojure"

Это красивый маленький SQL DSL, вот пример с сайта:

(select users
  (aggregate (count :*) :cnt)
  (where (or (> :visits 20)
             (< :last_login a-year-ago))))

Ответ 3

Если вы открыты для использования библиотеки Java, но хотите что-то, что охватывает простоту, возможно, вам понравится Persist. Вам понадобится 10 минут, чтобы посмотреть и посмотреть, подходит ли оно вашим потребностям.

Ответ 4

Я бы хотел добавить ответ от ноября 2011 года ради любого, кто пришел сюда из Google.

Текущая базовая библиотека доступа SQL в Clojure 1.3 - clojure.java.jdbc. Наверху есть очень хорошие библиотеки, такие как ClojureQL и Korma.

Ответ 5

Последняя и самая большая база данных SQL выглядит HoneySQL и Yesql.

HoneySQL - довольно элегантный DSL для генерации SQL-запросов. Ходят слухи, что он может даже модифицировать утверждения, которые будут оптимизированы, см. clojure -групповой поток Текущие лучшие в своем классе библиотеки JDBC? от 24 февраля 2015.

Нильс ван Клаверен говорит в вышеупомянутой теме:

"В основном, он [HoneySQL] генерирует SQL-скрипты для ссылки на ссылки внешнего ключа для очистки дубликатов в базе данных. Он принимает запрос выбора honeysql с (по крайней мере) таблицей from, group-by и order-by в качестве базового определения, которое должно считаться двойным, и в каком порядке записи записей должны быть сохранены. В сочетании с метаданными JDBC, которые запрос эффективно переписывается для генерации:

  • Временная таблица замены
  • Запросы унифицировать уникальные индексы, чтобы предотвратить конфликты при обновлении ссылок на внешние ключи.
  • Запросы для обновления всех внешних ключей
  • Удаление операторов для удаления всех дубликатов

Чтобы создать лучший исполняемый, но все же независимый от базы данных SQL, мне пришлось расширить honeysql с дополнительными предложениями, такими как OVER и PARTITION BY. Я бы не сказал, что это был легкий ветерок, но, похоже, работал очень хорошо.

...

Это сокращает SQL до (иногда) GB script примерно до нескольких строк строки SQL, а в некоторых случаях - с 19 часов до 1,5 минут.

Yesql, с другой стороны, нацелены на полную простоту. Он определяет некоторые функции для загрузки параметризованных .sql файлов.

В этой веб-странице упоминаются следующие "USP":

  • Никаких синтаксических сюрпризов. Ваша база данных не соответствует стандарту SQL - ни один из них не работает, но Yesql не волнует. Вы никогда не будете тратить время на поиск "эквивалентного синтаксиса sexp". Вам никогда не придется возвращаться к функции (raw-sql "some('funky'::SYNTAX)").
  • Улучшенная поддержка редактора. У вашего редактора, вероятно, уже есть отличная поддержка SQL. Сохраняя SQL как SQL, вы можете использовать его.
  • Командная совместимость. Ваши администраторы баз данных могут читать и писать SQL, которые вы используете в своем проекте Clojure.
  • Простая настройка производительности. Необходимо ОБЪЯСНИТЬ этот план запроса? Это намного проще, когда ваш запрос является обычным SQL.
  • Повторное использование запроса. Отбросьте те же SQL файлы в другие проекты, потому что они просто равны SQL. Поделитесь ими как подмодулем.

Ответ 6

Я использовал Berkeley DB для простой базы данных ключ/значение в Clojure. См. здесь.

Ответ 7

Здесь ClojureQL, который охватывает реляционную алгебру.

Ответ 8

В настоящее время существует Datomic и многие аналогичные решения, такие как DataScript для очень интересных реляционных (не-sql!) возможностей базы данных.

Ответ 9

Если вам понадобятся постоянные подключения и/или подключения к нескольким базам данных, и вы не хотите повторно устанавливать соединения так часто, я бы рекомендовал использовать пулы соединений с БД. Что-то вроде BoneCP или Tomcat CP.

Вы можете предоставить DataSources из этих пакетов (clojure.contrib.sql/with-connection...).