Comment ClojureQL se compare-t-il à clojure?contrib.sql?

Il semble que chacun couvre les cas de base comme la sélection de certaines colonnes et le filtrage par prédicat assez bien, mais je me demande comment chacun se compare pour les cas plus avancés. Est-il plus facile d'exprimer des requêtes complexes dans l'un vis-à-vis de l'autre? Une bibliothèque manque-t-elle des fonctionnalités que l'autre couvre?

25
demandé sur Josh K 2011-02-04 06:04:27

1 réponses

ClojureQL et clojure.contrib.sql sont deux bibliothèques assez différentes. Le premier vise à implémenter les primitives de l'algèbre relationnelle et à les compiler en SQL92. Il offre également un compilateur extensible qui peut être adapté au dialecte SQL spécifique à la base de données. Le second est un ensemble léger d'aides pour utiliser JDBC à partir du code Clojure.

Interrogation

Clojure.contib.sql

Avec clojure.contib.sql, vous devrez utiliser SQL pour écrire vos requêtes. Voici un exemple:

(sql/with-connection db
  (sql/with-query-results rs ["select * from customer"]
    (doseq [r rs] (println (:lastname r))))

ClojureQL

Comme ClojureQL est principalement un langage query , Il fournit un DSL riche basé sur Clojure pour créer des requêtes SQL. Je vais sauter des exemples avancés et ne vous montrer que le clojureql équivalent à la requête ci-dessus:

(sql/with-connection db
  (cql/with-results [rs (cql/table :customer)]
    (doseq [r rs] (println (:lastname r))))

Vous pouvez exprimer des requêtes de complexité arbitraire avec les deux, mais contrib.sql vous oblige à écrire du code SQL. Prenez note que ClojureQL DSL principal avantage sur SQL standard est composability. Sa fonction table renvoie un RTable objet représentant une requête sur la table spécifiée, vous pouvez enchaîner une autre fonction ClojureQL sur cet objet pour créer la requête dont vous avez besoin, puis la déréférencer pour l'exécuter. Reportez-vous à ClojureQL exemples page et documentation pour plus d'informations sur la façon de créer des requêtes plus complexes.

Insertion, mise à jour et suppression de

Clojure.contib.sql

Clojure.contrib.sql fournit un ensemble complet de fonctions à insérer, mettre à jour et supprimer rangée.

  • insérer :
    • (insert-records table & records), où les enregistrements sont des cartes
    • (insert-rows table & rows), où les lignes sont des vecteurs
    • (insert-values table column-names & value-groups)
  • mise à Jour: (update-values table where-params record)
  • Insertion ou mise à Jour: (update-or-insert-values table where-params record)
  • Suppression de: (delete-rows table where-params)

ClojureQL

ClojureQL fournit trois méthodes RTable pour manipuler les données de table spécifiées:

  • conj!, qui est un raccourci pour contrib.sql insert-records
  • disj!, qui est un raccourci pour contrib.sql delete-rows
  • {[17] } qui est similaire à contrib.sql update-or-insert-values

Ceux - ci ont l'avantage d'utiliser la syntaxe des prédicats ClojureQL, mais pour l'instant cette partie de ClojureQL ne génère pas de SQL agnostique de base de données car elle est séparée du compilateur. J'ai l'intention de résoudre ce problème en fusionnant le code d'une autre bibliothèque que j'ai écrite dans un avenir plus ou moins proche.

Schéma La Manipulation

Clojure.contib.sql

Clojure.contrib.sql fournit uniquement create-table et drop-table pour créer et supprimer des tables. Notez que ce sont des fonctions très simples qui ne rendront pas votre code portable. Pour modifier une table, vous devez envoyer des instructions SQL ALTER en utilisant la fonction do-commands.

ClojureQL

Aucune aide de manipulation de schéma fournie.

Lobos (bouchon sans vergogne; -)

C'est une bibliothèque que j'ai écrit pour boucher le trou laissé par ces deux bibliothèque. C'est un travail en cours, mais vous obtenez déjà un DSL Clojure pour envoyer des instructions DDL de manière agnostique à la base de données.

Voici un exemple de base pour créer une table:

(create (table :users (integer :id :unique)))

Et le modifier:

(alter :add (table :users (text :name)))

, Vous pouvez obtenir plus d'informations sur cette bibliothèque en visitant le site web ou github page. Il vise à fournir des fonctionnalités de plus haut niveau comme les migrations et le schéma déclaratif manipulation.

Autres

Clojure.contrib.sql a quelques aides de niveau inférieur supplémentaires, voir la documentation complète

Il y a plus à dire sur la façon dont ces bibliothèques gèrent les connexions de base de données, mais je vais laisser cela pour un autre jour!

P.S. : notez que ClojureQL et Lobos sont des bibliothèques relativement jeunes qui ont encore besoin de travail. Les deux descendent du projet clojureql original qui était un DSL couvrant l'ensemble du langage SQL. ClojureQL a déjà une API stable, mais ne fournit qu'un compilateur compatible SQL92. Lobos prend en charge le compilateur pour plusieurs bases de données. mais est toujours en développement actif et son API peut encore changer.

Update : j'ai fait quelques changements après une suggestion de Lau. ClojureQL lui-même ne vise pas à être indépendant de la base de données, mais fournit les moyens aux utilisateurs de remplacer le compilateur par un compilateur spécifique à la base de données. Notez que la partie DML de SQL est beaucoup plus standardisée que la DDL partie.

37
répondu Nicolas Buduroi 2011-02-05 20:40:26