Используйте базу данных с Clojure - PullRequest
39 голосов
/ 17 ноября 2008

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

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

Ответы [ 12 ]

19 голосов
/ 17 ноября 2008

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

14 голосов
/ 04 ноября 2011

Я бы сейчас (по состоянию на конец 2011 года) рекомендовал Корма - "Вкусный SQL для Clojure"

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

(select users
  (aggregate (count :*) :cnt)
  (where (or (> :visits 20)
             (< :last_login a-year-ago))))
8 голосов
/ 25 февраля 2015

Последняя и самая лучшая для баз данных SQL, похоже, HoneySQL и Yesql .

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

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

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

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

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

...

Это сокращает объем SQL до (иногда) ГБ сценария примерно до нескольких сотен строк SQL, а в одном случае - от 19 часов до 1,5 минут. "

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

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

  • Никаких синтаксических сюрпризов. Ваша база данных не соответствует стандарту SQL - ни один из них не делает - но Yesql не волнует. Вы никогда не будете тратить время на охоту за «эквивалентным синтаксисом sexp». Вам никогда не придется возвращаться к функции (raw-sql "some('funky'::SYNTAX)").
  • Лучшая поддержка редактора. Ваш редактор, вероятно, уже имеет отличную поддержку SQL. Сохраняя SQL как SQL, вы можете использовать его.
  • Командная совместимость. Ваши администраторы базы данных могут читать и писать SQL, который вы используете в своем проекте Clojure.
  • Более простая настройка производительности. Нужно объяснить этот план запроса? Гораздо проще, когда ваш запрос - обычный SQL.
  • Повторное использование запроса. Перетащите те же файлы SQL в другие проекты, потому что они просто старые SQL. Поделитесь ими как подмодулем.
8 голосов
/ 14 ноября 2011

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

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

8 голосов
/ 24 ноября 2008

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

5 голосов
/ 20 марта 2009

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

4 голосов
/ 18 ноября 2014

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

4 голосов
/ 19 ноября 2010

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

1 голос
/ 03 октября 2018

Во-первых, импортировать библиотеки из

 (ns clojureexercise.test
    (:require [clojure.java.jdbc :as sql])) ;;sql will alias used further in code to access java jdbc feature.

Во-вторых, функция ниже позволяет вам подключаться к серверу MySQL. Как и в Java, мы объявляем переменную Database для запуска DB, здесь мы точно так же определяем подключение к базе данных, и в следующем коде вы можете увидеть, что переменная db определена в функции dbconnect. Переменная db будет использоваться в дальнейшем при выполнении запросов.

(defn dbconnect []
  (def db{   
         :classname "com.mysql.jdbc.Driver" 
         :subprotocol "mysql"
         :subname "//127.0.0.1:3306/testdb" ;;testdb is the name of database
         :user "root"
         :password "password"}))

Теперь

;;Inserting Data into Database 
;;Table Name is patientinfo, consist columns {id, firstname, lastname, birthdate, gender}
 (defn insertdata []
  (sql/insert! db :patientinfo                    ;;used sql alias and db variable to insert data into table 
  {:id 1 :firstname "Satyam" :lastname "Ramawat" 
   :birthdate "1/1/2018" :gender "Male" }))

Я уточню это подробнее:

SQL / вставить! дБ: информация о пациенте

sql включит функцию запроса вставки, а db позволит системе понять, по какой таблице должна быть вставлена ​​запись, из какого соединения базы данных.

1 голос
/ 14 апреля 2016

Тогда есть SQLLite. Посмотрите на этот простой пример: https://github.com/ogrim/clojure-sqlite-example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...