40

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

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

4

12 回答 12

19

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

于 2008-11-17T03:45:29.850 回答
14

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

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

(select users
  (aggregate (count :*) :cnt)
  (where (or (> :visits 20)
             (< :last_login a-year-ago))))
于 2011-11-04T10:20:25.280 回答
8

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

于 2008-11-24T03:49:08.967 回答
8

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

Clojure 1.3 中当前的核心 SQL 访问库是 clojure.java.jdbc。在此基础上构建了一些非常好的库,例如ClojureQLKorma

于 2011-11-14T13:34:58.177 回答
8

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

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,比如OVERand PARTITION BY。我不会说它轻而易举,但似乎工作得很好。

...

这将 SQL 减少到(有时)GB 的脚本到大约 100 行 SQL,并且有一次,运行时间从 19 小时减少到 1.5 分钟。”

另一方面,Yesql旨在完全简单。它定义了一些函数来加载参数化.sql的文件。

它的网页提到了以下“USP”:

  • 没有语法上的惊喜。您的数据库不遵守 SQL 标准——它们都不遵守——但 Yesql 不在乎。您永远不会花时间寻找“等效的 sexp 语法”。你永远不需要回退到一个(raw-sql "some('funky'::SYNTAX)")函数。
  • 更好的编辑器支持。您的编辑器可能已经拥有很好的 SQL 支持。通过将 SQL 保留为 SQL,您可以使用它。
  • 团队互操作性。您的 DBA 可以读写您在 Clojure 项目中使用的 SQL。
  • 更容易的性能调整。需要解释那个查询计划吗?当您的查询是普通 SQL 时,这会容易得多。
  • 查询重用。将相同的 SQL 文件放到其他项目中,因为它们只是普通的 SQL。将它们作为子模块共享。
于 2015-02-25T20:56:17.397 回答
5

我在 Clojure 中将Berkeley DB用于一个简单的键/值数据库。这里

于 2009-03-20T11:12:35.727 回答
4

ClojureQL包含了关系代数

于 2010-11-19T13:35:40.167 回答
4

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

于 2014-11-17T23:46:04.257 回答
1

如果您需要持久连接和/或与多个数据库的连接,并且不想经常重新建立连接,我建议您使用数据库连接池。像 BoneCP 或 Tomcat CP 之类的东西。

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

于 2010-11-11T08:07:49.233 回答
1

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

于 2016-04-14T12:30:57.727 回答
1

首先,从导入库

 (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将允许系统了解必须在哪个表上插入哪个数据库连接的记录。

于 2018-10-03T20:11:25.460 回答
0

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

于 2011-01-09T09:12:39.200 回答