在Clojure中使用数据库

有什么方法使用Clojure的数据库?

我从Clojure知道,你可以用Java做任何事情,但这意味着我最终可能会使用一些与Clojure简单冲突的过于复杂的东西(比如Hibernate)。 任何build议或意见?

clojure-contrib有一个sql库,它是一个JDBC(java.sql.DriverManager)的简洁包装器。 它附带的testing文件有一些使用的例子。

我现在会(到2011年末)推荐Korma – “Clojure的美味SQL”

这是一个美丽的小型SQL DSL,这是来自网站的一个例子:

(select users (aggregate (count :*) :cnt) (where (or (> :visits 20) (< :last_login a-year-ago)))) 

为了有人从Google来到这里,我想添加2011年11月的答案。

Clojure 1.3中的当前核心SQL访问库是clojure.java.jdbc。 在ClojureQL和Korma之上build立了一些非常好的库。

如果您愿意使用Java库,但想要一些简单的东西,也许您会喜欢Persist 。 它只会花你10分钟的时间来看看,看看它是否符合你的需求。

SQL数据库的最新和最好的似乎是HoneySQL和Yesql 。

HoneySQL是一个非常优雅的DSL来生成SQL查询。 有传闻说它甚至可以修改高度优化的语句,请参阅2015年2月24日的clojure-group线程“ Current best-of-breed JDBC libraries? ”。

Niels van Klaveren在上述主题中表示:

“基本上,它[HoneySQL]生成SQL脚本来重新链接外键引用来清理数据库中的重复内容。它至less需要一个from表, group-byorder-by子句的honeysql select查询基本定义什么是双倍的,应该保留哪些logging顺序结合JDBC元数据,有效地查询重写生成:

  • 临时replace表
  • 查询来统一唯一索引,以防止在更新外键引用时发生冲突
  • 查询来更新所有外键引用
  • 删除语句以删除所有重复项

为了创build性能最好,但仍然是数据库独立的SQL,我不得不用扩展子句如OVERPARTITION BY来扩展honeysql。 我不会说这是一件轻而易举的事,但似乎工作得很好。

这将SQL的脚本(有时)减less到大约100行的SQL脚本,有一次,运行时间从19小时减less到1.5分钟。

另一方面, Yesql的目标则是完全简单。 它定义了一些函数来加载参数化的.sql文件。

这是网页提到以下“USPs”:

  • 没有语法惊喜。 你的数据库不符合SQL标准 – 他们都没有 – 但是Yesql不关心。 你永远不会花时间去寻找“等同的性别语法”。 你永远不需要回到(raw-sql "some('funky'::SYNTAX)")函数。
  • 更好的编辑支持。 你的编辑器可能已经有了很好的SQL支持。 通过将SQL保留为SQL,您可以使用它。
  • 团队互操作性。 您的DBA可以读写您在Clojure项目中使用的SQL。
  • 更简单的性能调整。 需要解释查询计划? 当你的查询是普通的SQL时,这会容易得多。
  • 查询重用。 将相同的SQL文件放到其他项目中,因为它们只是普通的SQL。 将它们分享为子模块。

我在Clojure中使用了Berkeley DB作为简单的键/值数据库。 看到这里 。

有ClojureQL包含关系代数。

现在有Datomic和许多像DataScript一样的非常有趣的关系型(非sql!)数据库function的类似解决scheme。

如果您需要持续连接和/或连接到多个数据库,并且不想每隔一段时间重新build立连接,我会build议使用数据库连接池。 像BoneCP或Tomcat CP。

你可以从这些包提供数据源到(clojure.contrib.sql / with-connection …)。

你也可以试试CLJ-Record, https://github.com/duelinmarkers/clj-record

然后是SQLLite。 看看这个简单的例子: https : //github.com/ogrim/clojure-sqlite-example