ClojureQL与clojure.contrib.sql相比如何?

cli*_*zin 25 sql clojure clojure-contrib clojureql

看起来每个人都涵盖了基本情况,例如选择某些列并通过谓词过滤得很好,但我想知道每种情况如何比较更高级的情况.是否更容易在一个方面表达复杂的查询?一个库是否缺少对方涵盖的任何功能?

Nic*_*roi 37

ClojureQL和clojure.contrib.sql是两个完全不同的库.第一个目标是实现关系代数的原语并将其编译为SQL92.它还提供可扩展的编译器,可以适应数据库特定的SQL方言.第二个是一组轻量级的帮助程序,用于从Clojure代码中使用JDBC.

查询

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))))
Run Code Online (Sandbox Code Playgroud)

ClojureQL

由于ClojureQL主要是一种查询语言,它提供了一个丰富的基于Clojure的DSL来创建SQL查询.我将跳过高级示例,只显示与上述查询等效的ClojureQL:

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

您可以用两者表达任意复杂性的查询,但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的缩写 insert-records
  • disj! 这是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创建和删除表.请注意,这些是非常简单的功能,不会使您的代码可移植.要更改表,您需要ALTER使用该do-commands函数发送SQL 语句.

ClojureQL

没有提供架构操作助手.

Lobos(无耻插头;-)

这是我写的一个库,用于插入这两个库留下的漏洞.这是一项正在进行的工作,但您已经获得了Clojure DSL以数据库无关的方式发送任何DDL语句.

这是创建表的基本示例:

(create (table :users (integer :id :unique)))
Run Code Online (Sandbox Code Playgroud)

并改变它:

(alter :add (table :users (text :name)))
Run Code Online (Sandbox Code Playgroud)

您可以访问网站github页面获取有关此库的更多信息.它旨在提供更高级别的功能,如迁移和声明性模式操作.

其他

clojure.contrib.sql有几个额外的低级助手,请参阅完整的文档

关于这些库如何处理数据库连接还有更多的说法,但我会留下另一天!

PS:请注意,ClojureQL和Lobos都是相对年轻的库,仍然需要一些工作.两者都来自最初的ClojureQL项目,这是一个覆盖整个SQL语言的DSL.ClojureQL已经有了一个稳定的API,但只提供了SQL92兼容的编译器.Lobos具有对多个数据库的编译器支持.但仍在积极开发中,其API仍然可以改变.

更新:在刘的建议之后我做了一些改变.ClojureQL本身并不旨在与数据库无关,而是为用户提供了通过特定于数据库替换编译器的方法.请注意,SQL的DML部分比DDL部分更标准化.