Похоже, что каждый из них охватывает основные случаи, такие как выбор определенных столбцов и фильтрация предикатом довольно хорошо, но мне интересно, как каждый сравнивается для более сложных случаев. Легче ли выражать сложные запросы в одном по отношению к другому? Является ли одна библиотека отсутствующей функциональностью, которую покрывает другая?
Как ClojureQL сравнивается с clojure.contrib.sql?
Ответ 1
ClojureQL и clojure.contrib.sql - две совершенно разные библиотеки. Первая цель - реализовать примитивы из реляционной алгебры и скомпилировать их в SQL92. Он также предлагает расширяемый компилятор, который может быть адаптирован к диалоговому диалоговому окну SQL. Второй - легкий набор помощников для использования JDBC из Clojure кода.
Запросы
clojure.contib.sql
С clojure.contib.sql вам придется использовать SQL для написания ваших запросов. Вот пример:
(sql/with-connection db
(sql/with-query-results rs ["select * from customer"]
(doseq [r rs] (println (:lastname r))))
ClojureQL
Поскольку ClojureQL является главным языком запросов, он предоставляет богатый Clojure DSL-объект для создания SQL-запросов. Я пропущу расширенные примеры и покажу вам эквивалент ClojureQL по вышеуказанному запросу:
(sql/with-connection db
(cql/with-results [rs (cql/table :customer)]
(doseq [r rs] (println (:lastname r))))
Вы можете выразить запросы произвольной сложности с обоими, но contrib.sql требует, чтобы вы написали код SQL. Обратите внимание, что основным преимуществом ClojureQL DSL по сравнению со стандартным SQL является возможность компоновки. Его функция table
возвращает объект RTable
, представляющий запрос в указанной таблице, вы можете связать другую функцию ClojureQL над этим объектом, чтобы создать требуемый запрос, а затем разыменовать его для его выполнения. Подробнее см. Статью ClojureQL и documentation для получения дополнительной информации. о том, как создавать более сложные запросы.
Вставка, обновление и удаление
clojure.contib.sql
clojure.contrib.sql предоставляет полный набор функций для вставки, обновления и удаления строк.
- Вставка:
-
(insert-records table & records)
, где записи - карты. -
(insert-rows table & rows)
, где строки - это векторы -
(insert-values table column-names & value-groups)
-
- Обновление:
(update-values table where-params record)
- Вставка или Обновление:
(update-or-insert-values table where-params record)
- Удаление:
(delete-rows table where-params)
ClojureQL
ClojureQL предоставляет три метода RTable
для управления указанными данными таблицы:
-
conj!
, который является shorcut для contrib.sqlinsert-records
-
disj!
, который является shorcut для contrib.sqldelete-rows
-
update-in!
, который похож на contrib.sqlupdate-or-insert-values
У них есть преимущество использования синтаксиса предикатов ClojureQL, но пока эта часть ClojureQL не генерирует агностический SQL базы данных, поскольку он отделен от компилятора. Я намерен исправить это, объединив код из другой библиотеки, которую я написал в более или менее ближайшем будущем.
Манипуляция схемы
clojure.contib.sql
clojure.contrib.sql предоставляет create-table
и drop-table
для создания и удаления таблиц. Обратите внимание, что это очень простые функции, которые не делают ваш код переносимым. Чтобы изменить таблицу, вам нужно отправить инструкции SQL ALTER
с помощью функции do-commands
.
ClojureQL
Никаких помощников манипуляции с схемами.
Лобос (бесстыдный плагин; -)
Это библиотека, которую я написал, чтобы подключить отверстие, оставшееся от этих двух библиотек. Это незавершенная работа, но вы уже получаете DSL Clojure для отправки каких-либо операторов DDL в агностическом режиме базы данных.
Вот базовый пример для создания таблицы:
(create (table :users (integer :id :unique)))
И изменив его:
(alter :add (table :users (text :name)))
Вы можете получить дополнительную информацию об этой библиотеке, посетив веб-сайт или страница github. Он нацелен на предоставление более высокоуровневых функций, таких как миграции и декларативная манипуляция схемой.
Другие
clojure.contrib.sql имеет пару дополнительных младших помощников, см. полную документацию
Там еще можно сказать, как эти библиотеки обрабатывают подключения к базе данных, но я оставлю это еще на один день!
P.S.. Обратите внимание, что как ClojureQL, так и Lobos - относительно молодые библиотеки, которые все еще нуждаются в некоторой работе. Оба спускались с исходного проекта ClojureQL, который был DSL, охватывающий весь язык SQL. ClojureQL уже имеет стабильный API, но предоставляет только компилятор, совместимый с SQL92. У Lobos есть поддержка компилятора для нескольких баз данных. но все еще находится в активной разработке, и его API все еще может измениться.
Обновление. Я внес некоторые изменения после предложения от Lau. Сам ClojureQL не стремится к агностике базы данных, но предоставляет пользователям возможность заменить компилятор на конкретную базу данных. Обратите внимание, что DML-часть SQL намного стандартизирована, чем часть DDL.