使用Clojure编程语言的数据库

39

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

我知道在Clojure中,你可以使用Java可以做的任何事情,但是这意味着我可能会使用一些与Clojure简洁性不符的过于复杂的东西(比如Hibernate)。有什么建议或意见吗?

12个回答

19

clojure-contrib有一个与JDBC (java.sql.DriverManager)紧密结合的sql库,它是一个轻量级的包装器。 它附带的测试文件中有一些使用示例。


clojure-contrib已经迁移,现在在这里:http://code.google.com/p/clojure-contrib/ - Rollo Tomazzi
6
实际上,自从我发布这个消息后,它已经移动了两次。现在它在这里:http://github.com/richhickey/clojure-contrib :) - Brian Carper
你也应该看看Clojure QL。 - nickik
3
已经移动(更好的说法是“已弃用”)。请直接从https://github.com/clojure获取您的库。 - dermatthias
看起来这现在在Github上的Clojure java.jdbc仓库中了。 - Richard Miskin

14

我现在(截至2011年底)会推荐Korma - "Tasty SQL for Clojure"。

这是一个非常漂亮的小型SQL DSL,以下是来自网站的一个示例:

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

2
Korma似乎已被遗弃:https://groups.google.com/d/msg/clojure/SgqL_zDvPdw/ZJtfvEucJQYJ - claj

8
如果您愿意使用Java库,但希望找到一个更简单易用的选项,也许您会喜欢Persist。只需花费10分钟查看,看看它是否符合您的需求。

8
最新和最好的SQL数据库工具似乎是HoneySQLYesqlHoneySQL是一个相当优雅的DSL,用于生成SQL查询。有传言称它甚至可以修改语句以高度优化,参见2015年2月24日clojure-group线程“当前最佳JDBC库?”。
在上述线程中,Niels van Klaveren说:
“基本上,它[HoneySQL]生成SQL脚本来重新链接外键引用,以清理数据库中的重复项。它以honeysql选择查询为基础定义,其中至少有一个from表,一个group-by和一个order-by子句来确定哪些是重复项,并按顺序保留记录。与JDBC元数据结合使用,该查询有效地被重写以生成:
  • 一个临时替换表
  • 查询以统一唯一索引,以防止更新外键引用时发生冲突
  • 查询以更新所有外键引用
  • 删除语句以删除所有重复项

为了创建性能最佳但仍与数据库无关的SQL,我不得不使用额外的子句扩展honeysql,如OVERPARTITION BY。我不能说这很轻松,但似乎工作得非常好。

...

"That cut down SQL to (sometimes) GB's of script to around a few 100 lines of SQL, and on one occasion, a runtime from 19 hours to 1.5 minutes."
在某些情况下,它将SQL减少到几百行脚本的级别,而不是几GB,并且有一次运行时间从19小时缩短至1.5分钟。
另一方面,Yesql致力于实现完全简单化。它定义了一些函数来加载参数化的.sql文件。
其网页提到以下“USP”:
- 没有语法上的惊喜。您的数据库并没有遵循SQL标准 - 其中没有一个 - 但是Yesql并不关心。您永远不必花时间寻找“等效的sexp语法”。您永远不需要退回到(raw-sql "some('funky'::SYNTAX)")函数。 - 更好的编辑器支持。您的编辑器可能已经具有出色的SQL支持。通过将SQL保留为SQL,您可以使用它。 - 团队互操作性。您的DBA可以阅读和编写您在Clojure项目中使用的SQL。 - 更容易的性能调整。需要解释查询计划吗?当您的查询是普通的SQL时,这样做会更容易。 - 查询重用。将相同的SQL文件放入其他项目中,因为它们只是普通的SQL。将它们作为子模块共享。

8

为了帮助从谷歌来到这里的任何人,我想加入一个截止2011年11月的答案。

Clojure 1.3中当前的核心SQL访问库是clojure.java.jdbc。还有一些很好的基于此构建的库,如ClojureQLKorma


5

我曾在Clojure中使用Berkeley DB作为一个简单的键值数据库。具体请参见这里


4

有一个名为ClojureQL的工具,它采用关系代数。


4

现在有很多类似于DatomicDataScript等解决方案,具备非常有趣的关系型(非SQL!)数据库功能。


2

1
首先,从库中导入:

 (ns clojureexercise.test
    (:require [clojure.java.jdbc :as sql])) ;;sql will alias used further in code to access java jdbc feature.

其次,下面的函数允许您连接MySQL服务器。就像在Java中,我们声明Database变量来启动DB一样,在这里我们也必须定义数据库连接,并且在下面的代码中,您可以看到db变量在dbconnect函数中被定义。 db变量将在运行查询时进一步使用。

(defn dbconnect []
  (def db{   
         :classname "com.mysql.jdbc.Driver" 
         :subprotocol "mysql"
         :subname "//127.0.0.1:3306/testdb" ;;testdb is the name of database
         :user "root"
         :password "password"}))

现在,
;;Inserting Data into Database 
;;Table Name is patientinfo, consist columns {id, firstname, lastname, birthdate, gender}
 (defn insertdata []
  (sql/insert! db :patientinfo                    ;;used sql alias and db variable to insert data into table 
  {:id 1 :firstname "Satyam" :lastname "Ramawat" 
   :birthdate "1/1/2018" :gender "Male" }))

我会进一步阐述:

sql/insert! db :patientinfo

sql 将启用插入查询功能,db 将使系统理解要将记录插入哪个数据库连接的哪个表中。请注意保留 HTML 标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接