回答

收藏

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

技术问答 技术问答 177 人阅读 | 0 人回复 | 2023-09-14

似乎每个案例都涵盖了基本案例,比如选择一些列并通过谓词进行良好的过滤,但我想知道如何将每个案例与更先进的案例进行比较。用一个比另一个更容易表达复杂的查询吗?一个库是否缺乏另一个库所涵盖的任何功能?
8 B  p9 F; H! v" @( f( C/ M/ ~1 q                                                                " W) T9 ]  \( `, ?
    解决方案:                                                                $ I/ p: O2 c2 r
                                                                ClojureQL和clojure.contrib.sql是两个完全不同的库。第一个目标是实现关系代数中的基元,并将其编译成SQL92.它还提供了适应特定数据库的可扩展编译器SQL使用方言Clojure代码中的JDBC轻量级帮助程序集。
8 `- l4 r3 p5 p- `! W查询方式clojure.contib.sql使用clojure.contib.sql,你必须使用它SQL编写查询。2 n, P- M: x. u! p. z1 B/ ?9 l
(sql/with-connection db  (sql/with-query-results rs ["select * from customer"]    (doseq [r rs] (println (:lastname r))))ClojureQL由于ClojureQL主要是 查询0 E" j+ `) ~* W+ W* }
因此,它提供了基于语言的基础Clojure的丰富DSL来创建SQL查询。我将跳过高级示例,只向您展示与上述查询相同的效果ClojureQL:
! |8 O9 D7 [% Q! Q(sql/with-connection db  (cql/with-results [rs (cql/table :customer)]    (doseq [r rs] (println (:lastname r))))你可以用两者来表示任何复杂的查询,但是contrib.sql要求您编写SQL代码SQL相比,ClojureQL& F/ z- U3 ~, J: f( c& M
DSL其主要优点是可组合性。table函数返回一个RTable您可以链接指定表上查询的其他对象ClojureQL函数创建所需的查询,然后取消引用以执行查询。更多关于如何创建更复杂查询的信息,请参见ClojureQL示例页面和文档。
, L  U8 D5 t0 z插入、更新和删除clojure.contib.sqlclojure.contrib.sql提供插入、更新和删除行的完美功能。& q, @& W( B" E3 B, L6 `
插入    : - a: C1 t$ ]6 a" _9 v+ x
(insert-records table & records),记录是地图
) q4 p* m- @3 s(insert-rows table & rows),行是向量: P" [4 j) J$ M: |% J1 Y& P4 Z
(insert-values table column-names & value-groups)
0 s6 l  V8 l. y& ]8 j% K$ @
更新中    :(update-values table where-params record)
2 F8 y, a9 F6 B  a插入    或 更新    :(update-or-insert-values table where-params record)
" n7 g9 O6 E5 D: I0 H( N2 N% `3 d删除中    :(delete-rows table where-params)
ClojureQLClojureQL提供了三种RTable处理指定表数据的方法:- D  m5 [5 B2 Y$ Q  f% k- I
conj! 这是contrib.sql的捷径 insert-records
5 U7 \/ J  g6 ]. q4 ldisj! 这是contrib.sql的捷径 delete-rows. x8 v/ z5 R/ M7 r
update-in! 这类似于contrib.sql的 update-or-insert-values
它们有用ClojureQL谓词语法的优势,但目前ClojureQL这部分没有生成与数据库无关的部分SQL,因为它与编译器分离。我计划通过合并我在不久的将来写的另一个库中的代码来解决这个问题。
0 u+ i( n2 z' Z  F1 a5 T5 k模式操纵clojure.contib.sqlclojure.contrib.sql只提供create-table和drop-table创建和删除表格。请注意,这些功能非常简单,无法移植您的代码。您需要更改表格ALTER使用do-commands函数发送SQL语句。
8 X+ n$ W' [% @0 u/ xClojureQL没有架构操作帮助器。; w- l3 Z' l; v! `
罗伯士(无耻插头;-)我写的是一个用来填补这两个两个图书馆留下的漏洞。这项工作正在进行中,但你已经得到了它Clojure DSL,任何与数据库无关的方式都可以发送DDL语句。: J: |4 M" O3 O. Q" {7 [
这是创建表的基本示例:
% Z! ^, W8 x5 ]! D(create (table :users (integer :id :unique)))并对其进行更改:+ W8 m" U+ d( y
(alter :add (table :users (text :name)))您可以通过访问网站或github页面获取更多关于该库的信息。它旨在提供更高层次的功能,如迁移和声明架构操作。% }) o1 M9 j  c  }: y+ s
其他clojure.contrib.sql还有几个额外的下层帮助程序,请参阅完整的文档0 d$ G  ^' p0 g
关于更多关于如何处理这些数据库的数据库连接,但我会再呆一天!
$ h* S' ~: _1 u! g  g2 aPS' @: Y1 o6 `* S
:请注意,ClojureQL和Lobos都是比较年轻的库,还是需要一些工作的。两者都来自原始。ClojureQL项目覆盖整个项目SQL语言的DSL。ClojureQL已经稳定了API,但仅提供与SQL92兼容编译器。Lobos支持多个数据库的编译器。但它仍在积极开发中API仍可更改。
' R8 O5 t+ Y/ p2 D* g  e' P更新0 j& V2 @% ?3 e7 ~; r
:在Lau提出建议后,我做了一些改变。ClojureQL它本身并不是为了与数据库无关,而是为用户提供了一种使用特定数据库的编译器来替换编译器的方法。请注意,SQL的DML部分比DDL部分更标准化。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则