gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:39:38 26 4
gpt4 key购买 nike

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

最佳答案

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 examples pagedocumentation有关如何创建更复杂查询的更多信息。

插入、更新和删除

clojure.contib.sql

clojure.contrib.sql 提供了一组全面的函数来插入、更新和删除行。
  • 插入 :
  • (insert-records table & records) ,其中记录是 map
  • (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-tabledrop-table用于创建和删除表。请注意,这些是非常简单的函数,不会使您的代码具有可移植性。要更改表,您需要发送 SQL ALTER使用 do-commands 的语句功能。

    ClojureQL

    没有提供模式操作助手。

    Lobos(无耻的插头;-)

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

    这是创建表的基本示例:
    (create (table :users (integer :id :unique)))

    并改变它:
    (alter :add (table :users (text :name)))

    您可以通过访问 website 获得有关该图书馆的更多信息。或 github page .它旨在提供更高级别的功能,如迁移和声明式架构操作。

    其他

    clojure.contrib.sql 有几个额外的低级助手,参见 complete documentation

    关于这些库如何处理数据库连接还有更多要说的,但我将留待改天再说!

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

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

    关于sql - ClojureQL 与 clojure.contrib.sql 相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894161/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com