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

ClojureQL与clojure.contrib.sql相比如何?,sql,clojure,clojure-contrib,clojureql,Sql,Clojure,Clojure Contrib,Clojureql,看起来每一个都很好地涵盖了一些基本情况,比如选择某些列和按谓词过滤,但是我想知道对于更高级的情况,每一个都是如何比较的。用一种语言相对于另一种语言表达复杂的查询更容易吗?一个库是否缺少其他库所涵盖的任何功能?ClojureQL和clojure.contrib.sql是两个完全不同的库。第一个目标是实现关系代数中的原语并将其编译为SQL92。它还提供了一个可扩展的编译器,可以适应特定于数据库的SQL方言。第二个是用于从Clojure代码中使用JDBC的轻量级帮助程序集 质疑 clojure.con

看起来每一个都很好地涵盖了一些基本情况,比如选择某些列和按谓词过滤,但是我想知道对于更高级的情况,每一个都是如何比较的。用一种语言相对于另一种语言表达复杂的查询更容易吗?一个库是否缺少其他库所涵盖的任何功能?

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))))
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和

插入、更新和删除 clojure.contib.sql clojure.contrib.sql提供了一套全面的函数来插入、更新和删除行

  • 插入
    • (插入记录表和记录)
      ,其中记录是映射
    • (插入行表和行)
      ,其中行是向量
    • (插入值表列名和值组)
  • 更新
    (更新参数记录的值表)
  • 插入或更新:
    (更新或插入参数记录的值表)
  • 删除
    (删除参数所在的行表)
ClojureQL ClojureQL提供了三种
RTable
方法来操作指定的表数据:

  • conj
    这是contrib.sql的
    插入记录的命令
  • disj
    这是一个contrib.sql的
    删除行的命令
  • 在中更新
    类似于contrib.sql的
    更新或插入值
它们具有使用ClojureQL谓词语法的优点,但目前ClojureQL的这一部分并不生成与数据库无关的SQL,因为它与编译器是分离的。我打算通过合并我在不久的将来编写的另一个库中的代码来解决这个问题

模式操作 clojure.contib.sql clojure.contrib.sql仅提供用于创建和删除表的
create table
drop table
。请注意,这些都是非常简单的函数,无法使代码可移植。要更改表,您需要使用
do命令
函数发送SQL
alter
语句

ClojureQL 未提供架构操作帮助程序

Lobos(无耻插头;-) 这是我写的一个库,用来填补这两个库留下的漏洞。这是一项正在进行的工作,但您已经获得了Clojure DSL,可以以不依赖数据库的方式发送任何DDL语句

以下是创建表的基本示例:

(create (table :users (integer :id :unique)))
并对其进行修改:

(alter :add (table :users (text :name)))
您可以通过访问或获取有关此库的更多信息。它旨在提供更高级别的功能,如迁移和声明性模式操作

其他 clojure.contrib.sql有两个额外的低级助手,请参见

关于这些库如何处理数据库连接还有很多要说的,但我将把它留到另一天

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


更新:在收到刘的建议后,我做了一些更改。ClojureQL本身的目标不是不依赖数据库,而是为用户提供用特定于数据库的编译器替换编译器的方法。请注意,SQL的DML部分比DDL部分更加标准化。

回答得不错。我将查找您的库(Lobos)。目前看来,Lobos和ClojureQL是互补的。我甚至希望它们是一个单一的图书馆。您希望在Lobos中实现ClojureQL的功能吗?是的,我正在考虑为版本2实现一种类似于ClojureQL的查询语言。现在,我只希望有足够的时间在冬季之前发布版本1。之后,我会将下一版本的最终计划传达给大家。由于Lobos的数据库不可知性,Lobos的查询语言比ClojureQL的工作要多得多,但在这之后,您就可以使用Clojure代码编写存储过程了,这将非常好!我的意思是视图,或者简单的类似视图的存储过程,以一种与数据库无关的方式支持完整的扩展SQL语言,看起来对我来说太多工作了!