ClojureQL и clojure.contrib.sql - две совершенно разные библиотеки. Первый направлен на реализацию примитивов из реляционной алгебры и их компиляцию в SQL92. Он также предлагает расширяемый компилятор, который можно адаптировать к конкретному диалекту SQL базы данных. Второй - это облегченный набор помощников для использования JDBC из кода Clojure.
* 1003 Запросы *
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 - это в основном язык query , он предоставляет богатый DSL на основе Clojure для создания 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 странице примеров и документации для получения дополнительной информации о том, как создавать более сложные запросы.
Вставка, обновление и удаление
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!
, что является сокращением к contrib.sql's insert-records
disj!
, что является сокращением к contrib.sql's delete-rows
update-in!
, что похоже на contrib.sql's update-or-insert-values
Преимущество использования синтаксиса предикатов ClojureQL, но пока эта часть ClojureQL не генерирует независимый от базы данных SQL, поскольку он отделен от компилятора. Я намереваюсь исправить это путем слияния кода из другой библиотеки, которую я написал в более или менее ближайшем будущем.
Схема управления
clojure.contib.sql
clojure.contrib.sql предоставляет только create-table
и drop-table
для создания и удаления таблиц. Обратите внимание, что это очень простые функции, которые не сделают ваш код переносимым. Чтобы изменить таблицу, вам нужно отправить операторы SQL ALTER
, используя функцию do-commands
.
ClojureQL
Помощники по манипулированию схемами не предоставлены.
Лобос (бесстыдная вилка; -)
Это библиотека, которую я написал, чтобы закрыть дыру, оставленную этими двумя библиотеками. Эта работа еще не завершена, но вы уже получаете Clojure DSL для отправки любых операторов DDL независимо от базы данных.
Вот основной пример создания таблицы:
(create (table :users (integer :id :unique)))
И изменив его:
(alter :add (table :users (text :name)))
Вы можете получить дополнительную информацию об этой библиотеке, посетив веб-сайт или страницу github . Он нацелен на предоставление функциональности более высокого уровня, такой как миграция и манипулирование декларативной схемой.
Другие
У clojure.contrib.sql есть пара дополнительных помощников более низкого уровня, см. Полную документацию
Можно еще рассказать о том, как эти библиотеки обрабатывают соединения с базой данных, но я оставлю это на другой день!
PS : обратите внимание, что и ClojureQL, и Lobos - относительно молодые библиотеки, которые все еще требуют некоторой работы.Оба произошли от оригинального проекта ClojureQL, который представлял собой DSL, охватывающий весь язык SQL.ClojureQL уже имеет стабильный API, но предоставляет только совместимый с SQL92 компилятор.Lobos имеет поддержку компилятора для нескольких баз данных.но все еще находится в активной разработке, и его API все еще может измениться.
Обновление : я внес некоторые изменения после предложения Lau.Сам ClojureQL не стремится быть независимым от базы данных, но предоставляет пользователям возможность заменить компилятор на специфичный для базы данных.Обратите внимание, что часть SQL DML гораздо более стандартизирована, чем часть DDL.