sql clojure clojure-contrib clojureql

¿Cómo se compara ClojureQL con clojure.contrib.sql?



clojure-contrib (1)

Parece que cada uno cubre los casos básicos, como seleccionar ciertas columnas y filtrar por predicado bastante bien, pero me pregunto cómo se compara cada uno para casos más avanzados. ¿Es más fácil expresar consultas complejas en una frente a la otra? ¿A una biblioteca le falta alguna funcionalidad que la otra cubra?


ClojureQL y clojure.contrib.sql son dos bibliotecas bastante diferentes. El primero apunta a implementar los primitivos del álgebra relacional y compilarlos a SQL92. También ofrece un compilador extensible que puede adaptarse al dialecto SQL específico de la base de datos. El segundo es un conjunto ligero de ayudantes para usar JDBC desde el código Clojure.

Preguntando

clojure.contib.sql

Con clojure.contib.sql, tendrá que usar SQL para escribir sus consultas. Aquí hay un ejemplo:

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

ClojureQL

Como ClojureQL es principalmente un lenguaje de consulta , proporciona un DSL rico basado en Clojure para crear consultas SQL. Saltaré ejemplos avanzados y solo te mostraré el equivalente de ClojureQL a la consulta anterior:

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

Puede expresar consultas de complejidad arbitraria con ambos, pero contrib.sql requiere que escriba un código SQL. Tenga en cuenta que la ventaja principal de ClojureQL DSL sobre SQL estándar es la capacidad de composición. Su función de table devuelve un objeto RTable que representa una consulta en la tabla especificada, puede encadenar otra función ClojureQL sobre ese objeto para crear la consulta que necesita y, a continuación, eliminar la referencia para ejecutarla. Consulte la página de ejemplos de ClojureQL y la documentation para obtener más información sobre cómo crear consultas más complejas.

Inserción, actualización y eliminación

clojure.contib.sql

clojure.contrib.sql proporciona un conjunto completo de funciones para insertar, actualizar y eliminar filas.

  • Insertando :
    • (insert-records table & records) , donde los registros son mapas
    • (insert-rows table & rows) , donde las filas son vectores
    • (insert-values table column-names & value-groups)
  • Actualización : (update-values table where-params record)
  • Inserción o actualización : (update-or-insert-values table where-params record)
  • Eliminando : (delete-rows table where-params)

ClojureQL

ClojureQL proporciona tres métodos RTable para manipular los datos de la tabla especificada:

  • conj! que es un acceso directo a los registros de insert-records de contrib.sql
  • disj! que es un acceso directo a las filas de delete-rows de contrib.sql
  • update-in! que es similar a los valores de update-or-insert-values contrib.sql

Estos tienen la ventaja de usar la sintaxis de predicados de ClojureQL, pero por ahora esta parte de ClojureQL no está generando SQL independiente de la base de datos ya que se separa del compilador. Tengo la intención de solucionarlo fusionando el código de otra biblioteca que escribí en un futuro más o menos cercano.

Manipulación de esquemas

clojure.contib.sql

clojure.contrib.sql solo proporciona create-table y drop-table para crear y eliminar tablas. Tenga en cuenta que estas son funciones muy simples que no harán que su código sea portátil. Para alterar una tabla, deberá enviar instrucciones SQL ALTER utilizando la función do-commands .

ClojureQL

No se proporcionan ayudantes de manipulación de esquemas.

Lobos (enchufe descarado ;-)

Esta es una biblioteca que escribí para tapar el agujero que dejaron estas dos bibliotecas. Es un trabajo en progreso, pero ya tienes un DSL de Clojure para enviar cualquier declaración DDL de una forma independiente de la base de datos.

Aquí hay un ejemplo básico para crear una tabla:

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

Y alterándolo:

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

Puede obtener más información sobre esta biblioteca visitando el website o la página de github . Su objetivo es proporcionar funcionalidad de alto nivel como migraciones y manipulación de esquemas declarativos.

Otros

clojure.contrib.sql tiene un par de ayudantes adicionales de nivel inferior, consulte la documentación completa

Hay más que decir acerca de cómo estas bibliotecas manejan las conexiones de base de datos, ¡pero dejaré eso para otro día!

PD : Tenga en cuenta que tanto ClojureQL como Lobos son bibliotecas relativamente jóvenes que todavía necesitan algo de trabajo. Ambos descienden del proyecto ClojureQL original, que era un DSL que cubre todo el lenguaje SQL. ClojureQL ya tiene una API estable, pero solo proporciona un compilador compatible con SQL92. Lobos tiene soporte de compilador para múltiples bases de datos. pero todavía está en desarrollo activo y su API todavía puede cambiar.

Actualización : He hecho algunos cambios después de una sugerencia de Lau. El propio ClojureQL no pretende ser independiente de la base de datos, pero proporciona los medios para que los usuarios reemplacen el compilador por uno específico de la base de datos. Tenga en cuenta que la parte DML de SQL es mucho más estandarizada que la parte DDL.