使用Clojure数据库

pup*_*eno 39 database clojure

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

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

Bri*_*per 19

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

  • 实际上,自从我发布以来它已经移动了两次.它现在在这里:http://github.com/richhickey/clojure-contrib :) (6认同)
  • 并再次感动(更好:弃用).直接从https://github.com/clojure获取您的库 (3认同)

mik*_*era 14

我现在(截至2011年底)推荐Korma - "Clojure的美味SQL"

这是一个漂亮的小SQL DSL,这是网站上的一个例子:

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

  • Korma似乎被遗弃了:https://groups.google.com/d/msg/clojure/SgqL_zDvPdw/ZJtfvEucJQYJ (2认同)

fox*_*nut 8

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


Joh*_*tie 8

我想添加一个2011年11月的答案,以便有人从谷歌来这里.

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


cla*_*laj 8

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

HoneySQL是一个非常优雅的DSL来生成SQL查询.有传闻它甚至可以修改高度优化的语句,请参阅2015年2月24日的clojure-group线程" 当前最佳的JDBC库? ".

Niels van Klaveren在上述帖子中说:

"基本上,它[HoneySQL]生成SQL脚本以重新链接外键引用以清理数据库中的重复项.它需要一个honeysql select查询,其中包含(至少)一个from表,一个group-by和一个order-by子句作为基本定义,需要考虑什么双重,以及应保留记录的顺序.结合JDBC元数据,查询有效地被重写以生成:

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

为了创造最佳的表演,但仍独立于数据库的SQL,我必须有额外的条款一样延伸honeysql OVERPARTITION 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.将它们作为子模块共享.


Mar*_*bst 5

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