Подтвердить что ты не робот

Как ClojureQL сравнивается с clojure.contrib.sql?

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

4b9b3361

Ответ 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.sql insert-records
  • disj!, который является shorcut для contrib.sql delete-rows
  • update-in!, который похож на contrib.sql update-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.