有哪些使用 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 分钟即可查看它是否符合您的需求。
最新最好的 SQL 数据库似乎是HoneySQL和Yesql。
HoneySQL是一种非常优雅的 DSL,用于生成 SQL 查询。有传言说它甚至可以修改语句以进行高度优化,请参阅 clojure-group 线程“ Current best-of-breed JDBC library? ”,来自 2015 年 2 月 24 日。
Niels van Klaveren 在上述帖子中说:
“基本上,它 [HoneySQL] 生成 SQL 脚本以重新链接外键引用以清理数据库中的重复项。它需要一个带有(至少)一个from
表、一个group-by
和一个order-by
子句的 Honeysql 选择查询作为基本定义要考虑的内容双打, 并且应该保留记录的顺序. 结合 JDBC 元数据, 查询有效地被重写以生成:
为了创建性能最好但仍然独立于数据库的 SQL,我不得不使用额外的子句来扩展 honeysql,比如OVER
and PARTITION BY
。我不会说它轻而易举,但似乎工作得很好。
...
这将 SQL 减少到(有时)GB 的脚本到大约 100 行 SQL,并且有一次,运行时间从 19 小时减少到 1.5 分钟。”
另一方面,Yesql旨在完全简单。它定义了一些函数来加载参数化.sql
的文件。
它的网页提到了以下“USP”:
(raw-sql "some('funky'::SYNTAX)")
函数。我在 Clojure 中将Berkeley DB用于一个简单的键/值数据库。见这里。
ClojureQL包含了关系代数。
现在有Datomic和许多类似的解决方案,如DataScript ,它们也用于非常有趣的关系(非 sql!)数据库功能。
如果您需要持久连接和/或与多个数据库的连接,并且不想经常重新建立连接,我建议您使用数据库连接池。像 BoneCP 或 Tomcat CP 之类的东西。
您可以将这些包中的数据源提供给 (clojure.contrib.sql/with-connection ...)。
然后是 SQLLite。看看这个简单的例子:https ://github.com/ogrim/clojure-sqlite-example
首先,从导入库
(ns clojureexercise.test
(:require [clojure.java.jdbc :as sql])) ;;sql will alias used further in code to access java jdbc feature.
其次,下面的功能允许您连接 MySQL 服务器。就像在 Java 中一样,我们声明数据库变量来启动 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/插入!数据库:患者信息
sql将启用插入查询功能,而db将允许系统了解必须在哪个表上插入哪个数据库连接的记录。
你也可以试试 CLJ-Record,https://github.com/duelinmarkers/clj-record