有哪些方法可以使用Clojure中的数据库?
我从Clojure知道你可以用Java做任何事情,但这意味着我最终可能会使用与Clojure简单性相冲突的过于复杂的东西(比如Hibernate)。有什么建议或意见吗?
答案 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)
答案 4 :(得分:8)
最新和最好的SQL数据库似乎是HoneySQL和Yesql。
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,我不得不使用OVER
和PARTITION BY
之类的额外子句扩展honeysql。我不会说这是微风,但似乎工作得很好。
...
将SQL缩减为(有时)GB脚本到大约100行SQL,有一次,运行时间从19小时缩短到1.5分钟。&#34;
另一方面, Yesql 旨在实现完全简单。它定义了一些加载参数化.sql
文件的函数。
该网页提到以下&#34; USP&#34;:
(raw-sql "some('funky'::SYNTAX)")
函数。答案 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