使用Clojure数据库

时间:2008-11-17 03:14:11

标签: database clojure

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

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

12 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:8)

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

答案 3 :(得分:8)

我想添加一份2011年11月的答案,以便有人来谷歌。

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

答案 4 :(得分:8)

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

HoneySQL 是一个非常优雅的DSL来生成SQL查询。有传言它甚至可以修改高度优化的陈述,参见clojure-group线程&#34; Current best-of-breed JDBC libraries?&#34;从2015年2月24日开始。

Niels van Klaveren在上述帖子中说:

&#34;基本上,它[HoneySQL]生成SQL脚本以重新链接外键引用以清理数据库中的重复项。它需要一个honeysql select查询,其中包含(至少)一个from表,一个group-by和一个order-by子句作为基本定义,它们被认为是双倍的,并且记录应该在哪个顺序中保存。与JDBC元数据结合使用,可以有效地重写查询以生成:

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

为了创建性能最佳但仍然与数据库无关的SQL,我不得不使用OVERPARTITION BY之类的额外子句扩展honeysql。我不会说这是微风,但似乎工作得很好。

...

将SQL缩减为(有时)GB脚本到大约100行SQL,有一次,运行时间从19小时缩短到1.5分钟。&#34;

另一方面,

Yesql 旨在实现完全简单。它定义了一些加载参数化.sql文件的函数。

该网页提到以下&#34; USP&#34;:

  • 没有语法上的惊喜。您的数据库并不符合SQL标准 - 它们都没有 - 但是Yesql并不关心。你永远不会花时间寻找&#34;等效的sexp语法&#34;。您永远不需要回到(raw-sql "some('funky'::SYNTAX)")函数。
  • 更好的编辑支持。您的编辑器可能已经拥有出色的SQL支持。通过将SQL保持为SQL,您可以使用它。
  • 团队互操作性。您的DBA可以读写您在Clojure项目中使用的SQL。
  • 更轻松地调整性能。需要解析查询计划吗?当您的查询是普通SQL时,它会容易得多。
  • 查询重用。将相同的SQL文件删除到其他项目中,因为它们只是简单的&#39; SQL。将它们作为子模块分享。

答案 5 :(得分:5)

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

答案 6 :(得分:4)

ClojureQL包含关系代数。

答案 7 :(得分:4)

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

答案 10 :(得分: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,这与定义数据库连接性的方法相同,在下面的代码中,您可以看到dbconnect函数中定义了db变量。 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 /插入! db:Patientinfo

sql 将启用插入查询功能,而 db 将使系统了解必须在哪个表上插入哪个数据库连接的记录。

答案 11 :(得分:0)

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