2008-11-17 41 views
38

使用Clojure中的数据库的方法有哪些?在Clojure中使用数据库

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

回答

18

clojure-contrib有一个sql库,它是JDBC(java.sql.DriverManager)的一个薄包装器。随附的测试文件中有一些使用示例。

+0

clojure-contrib已经移动。它现在在这里:http://code.google.com/p/clojure-contrib/ – 2009-10-21 07:06:21

+6

实际上,自从我发布这个版本以来,它已经移动了两次。它现在在这里:http://github.com/richhickey/clojure-contrib :) – 2009-10-21 08:43:50

+0

你应该看看clojure ql。 – nickik 2010-11-11 18:51:11

8

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

5

我已经使用了Berkeley DB为Clojure中的简单键/值数据库。请参阅here

1

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

您可以将DataSources从这些包提供给(clojure.contrib.sql/with-connection ...)。

14

我现在(截至2011年末)推荐Korma - “为Clojure的美味SQL”

这是一个美丽的小SQL DSL,这里是从一个例子网址:

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

我想添加一个2011年11月的答案,以便来自谷歌的任何人来到这里。

Clojure 1.3当前的核心SQL访问库是clojure.java.jdbc。在ClojureQLKorma之上有一些非常好的库。

4

现在有Datomic以及许多类似的解决方案,如DataScript也用于非常有趣的关系(非sql!)数据库功能。

8

SQL数据库的最新和最好的似乎是HoneySQLYesql

HoneySQL是一个非常优雅的DSL来生成SQL查询。有传言称它甚至可以修改报告中予以高度优化的,请参阅从2月24日2015年

Clojure的组线程“ Current best-of-breed JDBC libraries?

尼尔斯面包车Klaveren说,在上述螺纹:

“基本上,它[HoneySQL]生成SQL脚本来重新链接外键引用以清理数据库中的重复内容。它至少需要一个包含from表,group-byorder-by子句的honeysql select查询作为基本定义,需要考虑的双打,并保存记录的顺序。在与该查询有效地被改写,生成JDBC元数据组合:

  • 临时替换表
  • 查询统一唯一索引,以防止发生冲突时,外键引用更新
  • 查询更新所有外键引用
  • DELETE语句删除所有复制

创建最好的表演,但仍独立于数据库的SQL,我不得不延长honeysql附加条款如OVERPARTITION BY。我不会说这是一件轻而易举的事,但似乎工作得很好。

...

这减少的SQL(有时)GB的脚本来围绕着几个100行SQL,并有一次,19小时运行时间1.5分钟。”

Yesql,另一方面,目的是为总简单起见它定义了一些函数来加载参数.sql -files

这是网页提到下面的“卖点”:。

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