Ответ 1
clojure-contrib имеет библиотеку sql, которая представляет собой тонкую оболочку вокруг JDBC (java.sql.DriverManager). В тестовом файле, который поставляется с ним, есть некоторые примеры его использования.
Какие существуют методы использования базы данных из Clojure?
Я знаю, что из Clojure вы можете делать все, что можете, с помощью Java, но это означает, что я могу использовать что-то слишком сложное (например, Hibernate), которое сталкивается с простотой Clojure. Любые рекомендации или комментарии?
clojure-contrib имеет библиотеку sql, которая представляет собой тонкую оболочку вокруг JDBC (java.sql.DriverManager). В тестовом файле, который поставляется с ним, есть некоторые примеры его использования.
Теперь я (по состоянию на конец 2011 года) рекомендую Korma - "Вкусный SQL для Clojure"
Это красивый маленький SQL DSL, вот пример с сайта:
(select users
(aggregate (count :*) :cnt)
(where (or (> :visits 20)
(< :last_login a-year-ago))))
Если вы открыты для использования библиотеки Java, но хотите что-то, что охватывает простоту, возможно, вам понравится Persist. Вам понадобится 10 минут, чтобы посмотреть и посмотреть, подходит ли оно вашим потребностям.
Я бы хотел добавить ответ от ноября 2011 года ради любого, кто пришел сюда из Google.
Текущая базовая библиотека доступа SQL в Clojure 1.3 - clojure.java.jdbc. Наверху есть очень хорошие библиотеки, такие как ClojureQL и Korma.
Последняя и самая большая база данных 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":
(raw-sql "some('funky'::SYNTAX)")
.Я использовал Berkeley DB для простой базы данных ключ/значение в Clojure. См. здесь.
Здесь ClojureQL, который охватывает реляционную алгебру.
В настоящее время существует Datomic и многие аналогичные решения, такие как DataScript для очень интересных реляционных (не-sql!) возможностей базы данных.
Если вам понадобятся постоянные подключения и/или подключения к нескольким базам данных, и вы не хотите повторно устанавливать соединения так часто, я бы рекомендовал использовать пулы соединений с БД. Что-то вроде BoneCP или Tomcat CP.
Вы можете предоставить DataSources из этих пакетов (clojure.contrib.sql/with-connection...).
Вы также можете попробовать CLJ-Record, https://github.com/duelinmarkers/clj-record
Тогда есть SQLLite. Взгляните на этот простой пример: https://github.com/ogrim/clojure-sqlite-example