有哪些方法可以使用Clojure中的数据库?
我从Clojure知道你可以用Java做任何事情,但这意味着我最终可能会使用与Clojure简单相冲突的过于复杂的东西(比如Hibernate).有什么建议或意见吗?
clojure-contrib有一个sql库,它是JDBC(java.sql.DriverManager)的瘦包装器.随附的测试文件包含一些使用示例.
我现在(截至2011年底)推荐Korma - "Clojure的美味SQL"
这是一个漂亮的小SQL DSL,这是网站上的一个例子:
(select users (aggregate (count :*) :cnt) (where (or (> :visits 20) (< :last_login a-year-ago))))
如果你愿意使用Java库但想要一些简单的东西,也许你会喜欢Persist.只需10分钟即可看看它是否符合您的需求.
我想添加一个2011年11月的答案,以便有人从谷歌来这里.
Clojure 1.3中的当前核心SQL访问库是clojure.java.jdbc.在ClojureQL和Korma之上构建了一些非常好的库.
SQL数据库的最新和最好的似乎是HoneySQL和Yesql.
HoneySQL是一个非常优雅的DSL来生成SQL查询.有传闻它甚至可以修改高度优化的语句,请参阅2015年2月24日的clojure-group线程" 当前最佳的JDBC库? ".
Niels van Klaveren在上述帖子中说:
"基本上,它[HoneySQL]生成SQL脚本以重新链接外键引用以清理数据库中的重复项.它需要一个honeysql select查询,其中包含(至少)一个from
表,一个group-by
和一个order-by
子句作为基本定义,需要考虑什么双重,以及应保留记录的顺序.结合JDBC元数据,查询有效地被重写以生成:
临时替换表
查询统一唯一索引,以防止更新外键引用时发生冲突
查询以更新所有外键引用
删除语句以删除所有重复项
为了创造最佳的表演,但仍独立于数据库的SQL,我必须有额外的条款一样延伸honeysql OVER
和PARTITION BY
.我不会说这是微风,但似乎工作得很好.
...
这将SQL(有时)GB的脚本减少到几百行SQL,有一次运行时间为19小时到1.5分钟."
另一方面,Yesql旨在实现完全简单.它定义了一些加载参数化文件的.sql
函数.
它的网页提到了以下"USP":
没有语法上的惊喜.您的数据库不符合SQL标准 - 它们都没有 - 但Yesql并不关心.你永远不会花时间寻找"等效的sexp语法".你永远不需要回归(raw-sql "some('funky'::SYNTAX)")
功能.
更好的编辑支持.您的编辑器可能已经拥有出色的SQL支持.通过将SQL保持为SQL,您可以使用它.
团队互操作性.您的DBA可以读写您在Clojure项目中使用的SQL.
更容易进行性能调整.需要解析查询计划吗?当您的查询是普通SQL时,它会容易得多.
查询重用.将相同的SQL文件放到其他项目中,因为它们只是简单的SQL.将它们作为子模块共享.
我在Clojure中使用Berkeley DB作为简单的键/值数据库.看到这里.