Как ClojureQL сравнивается с clojure.contrib.sql? - PullRequest
25 голосов
/ 04 февраля 2011

Похоже, что каждый из них достаточно хорошо покрывает основные случаи, такие как выбор определенных столбцов и фильтрация по предикату, но мне интересно, как каждый из них сравнивает более сложные случаи. Проще ли выражать сложные запросы в одном и другом? В одной библиотеке отсутствует какая-либо функциональность, охватываемая другой?

1 Ответ

37 голосов
/ 04 февраля 2011

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.

...